返回指向不同文件的char指针

时间:2012-08-20 13:44:40

标签: 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_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 

5 个答案:

答案 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);