C 返回指向不同文件的字符指针
即使调用函数不在同一个文件中,是否可以返回char指针。。。。例如,如果我调用该函数: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
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);