Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 返回指向不同文件的字符指针_C - Fatal编程技术网

C 返回指向不同文件的字符指针

C 返回指向不同文件的字符指针,c,C,即使调用函数不在同一个文件中,是否可以返回char指针。。。。例如,如果我调用该函数: void gotest(sqlite3 *pt,char *nutzers) { char string[1064]; char *text; text = get_data_byName(pt,"whatever",string); printf("test %s \n\n\n same file",text); } char *get_data_byNa

即使调用函数不在同一个文件中,是否可以返回char指针。。。。例如,如果我调用该函数:

 void gotest(sqlite3 *pt,char *nutzers)
{
    char string[1064];
    char *text;
    text = get_data_byName(pt,"whatever",string);   
    printf("test %s \n\n\n same file",text);    
}

 char *get_data_byName(sqlite3 *ptr,char *user,char *resulter)
{
    .......
    resulter = "TestCall";
    return resulter;
}
如果
gotest(sqlite3*pt,char*nutzers)
char*get\u data\u byName(sqlite3*ptr,char*user,char*resulter)
在不同的文件中,那么gcc给出以下内容

赋值从不带强制转换的整数生成指针

如果我在一个文件中有两个函数,那么一切都可以正常工作

例如:

gcc -o test test.c time.c database.c libircclient-1.6/src/libircclient.o -lsqlite3 

出现错误并不是因为函数位于不同的文件中:来自不同编译单元的函数可以相互调用。真正的问题是,您试图在不提供原型的情况下从另一个文件调用函数。当这种情况发生时,C假定返回类型为
int

创建包含此内容的头文件:

按名称获取数据

char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);
现在将此头文件包含在两个C文件中:

#包括“按名称获取数据”


编译警告将消失。

必须没有对
gotest()
可见的
get\u data\u byName()
声明,因此编译器生成一个隐式声明并分配一个返回类型
int
,因此出现警告。要解决此问题,请在头文件(例如)中添加
get\u data\u byName()
的声明,并确保它对
gotest()
可见

获取数据.h

#ifndef GET_DATA_HEADER_H_
#define GET_DATA_HEADER_H_

extern char* get_data_byName(sqlite3 *ptr,char *user,char *resulter);

#endif
#ifndef GET_DATA_BY_NAME_H
#define GET_DATA_BY_NAME_H
char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);
#endif

然后在定义了
gotest()
.c
文件中包含

是的,这当然是可能的。在调用函数之前,需要先声明函数:

char * get_data_byName(sqlite3 *ptr, char *user, char *resulter);
此外,在适用的情况下,还应该使用
const
作为指针


请记住,如果需要返回非文字字符串,则需要考虑内存管理。

您需要文件的标题。如果GCC在其使用的文件中没有看到函数原型,则GCC假定该函数返回一个
int
。你需要仔细阅读标题。同时,将其放入使用
get\u data\u byName
的文件中就足够了:

char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);
您必须记住,尽管当GCC链接时,它知道您定义了
get_data\u byName
,但在编译时,它需要知道它有哪些参数和返回值。这就是标题的作用。标题包含函数原型。函数原型如下所示:

char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);
如果您将一个
.c
文件中定义的所有函数的原型放在一个
.h
文件中,并且它们
#将该头包含在使用该函数的文件中,您将不会再收到该错误。因此,如果您有一个名为
get\u data\u by\u name.c
的文件,这将是
get\u data\u by\u name.h

#ifndef GET_DATA_HEADER_H_
#define GET_DATA_HEADER_H_

extern char* get_data_byName(sqlite3 *ptr,char *user,char *resulter);

#endif
#ifndef GET_DATA_BY_NAME_H
#define GET_DATA_BY_NAME_H
char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);
#endif
然后只需
#将它包含在使用
按名称获取数据的文件中

#include "get_data_by_name.h"
取决于如何将它们“放在单独的文件中”。在K&R中指定的格式需要为每个.c文件增加2个.h文件。.h文件将声明函数原型。从那里,您可以将文件_2.h包含到文件_1.c中,并使get_data_byName可供gotest使用。希望有帮助

**file_1.c**
include "file_1.h"
include "file_2.h"

void gotest(sqlite3 *pt,char *nutzers)
{
    char string[1064];
    char *text;
    text = get_data_byName(pt,"whatever",string);   
    printf("test %s \n\n\n same file",text);    
}


**file_2.c**
char *get_data_byName(sqlite3 *ptr,char *user,char *resulter)
{
    .......
    resulter = "TestCall";
    return resulter;
} 

**file_1.h**
void gotest(sqlite3 *pt,char *nutzers);

**file_2.h**
char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);