2

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

 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 
4

5 回答 5

2

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

使用以下内容制作头文件:

get_data_byName.h

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

现在在你的两个 C 文件中包含这个头文件:

#include "get_data_byName.h"

编译警告将消失。

于 2012-08-20T13:47:22.550 回答
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()定义。

于 2012-08-20T13:48:03.747 回答
2

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

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

此外,您应该在适用的情况下真正使用指针。const

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

于 2012-08-20T13:48:13.610 回答
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"
于 2012-08-20T13:49:03.783 回答
2

取决于您如何将它们“放在单独的文件中”。K&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);
于 2012-08-20T13:54:45.157 回答