是否可以返回一个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_data_byName(sqlite3 *ptr,char *user,char *resulter)
位于不同的文件中,则gcc会提供以下内容
分配从没有强制转换的整数中生成指针
如果我在一个文件中有两个函数,一切正常。
编译如下:
gcc -o test test.c time.c database.c libircclient-1.6/src/libircclient.o -lsqlite3
答案 0 :(得分:2)
你得到错误不是因为函数在不同的文件中:来自不同编译单元的函数互相调用是完全正确的。真正的问题是你试图从另一个文件调用一个函数而不提供原型。发生这种情况时,C假定返回类型为int
。
制作包含此内容的标头文件:
get_data_byName.h
char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);
现在将这个头文件包含在两个C文件中:
#include“get_data_byName.h”
编译警告将消失。
答案 1 :(得分:2)
get_data_byName()
必须没有gotest()
可见的声明,因此编译器会生成一个隐式声明并指定返回类型int
,因此会发出警告。要解决,请在头文件中添加get_data_byName()
的声明,并确保gotest()
可见。
get_data.h
:
#ifndef GET_DATA_HEADER_H_
#define GET_DATA_HEADER_H_
extern char* get_data_byName(sqlite3 *ptr,char *user,char *resulter);
#endif
然后在#include <get_data.h>
文件中.c
gotest()
定义了{{1}}。
答案 2 :(得分:2)
是的,这当然是可能的。在调用函数之前,您需要有函数的声明:
char * get_data_byName(sqlite3 *ptr, char *user, char *resulter);
此外,您应该真正使用const
作为适用的指针。
请记住,如果您需要返回非文字字符串,则需要考虑内存管理。
答案 3 :(得分:2)
您需要文件的标题。如果GCC在中使用的文件中没有看到函数原型,则GCC假定该函数返回int
。你需要阅读标题。同时,将其放在您使用get_data_byName
的文件中就足够了:
char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);
你必须记住,虽然当GCC链接时,它知道你定义get_data_byName
,当它编译时,它需要知道它有什么参数和返回值。这是标题的目的。标题包含函数原型。函数原型如下所示:
char *get_data_byName(sqlite3 *ptr,char *user,char *resulter);
如果将一个.c
文件中定义的所有函数的原型放在一个.h
文件中,并将#include
那个标题放在使用该函数的文件中,那么你不会得到那个错误了。因此,如果您有一个名为get_data_by_name.c
的文件,那么这将是get_data_by_name.h
:
#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_byName
:
#include "get_data_by_name.h"
{{1}}
答案 4 :(得分:2)
取决于你如何“在单独的文件中”。 K&amp; R中指定的格式对于您拥有的每个.c文件都需要2个额外的.h文件。 .h文件将声明函数原型。从那里,您可以将file_2.h包含到您的file_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);