【发布时间】:2011-05-15 09:02:45
【问题描述】:
如果我在文件func1.c 中定义了一个函数,并且我想从文件call.c 中调用它。我怎样才能完成这项任务?
【问题讨论】:
如果我在文件func1.c 中定义了一个函数,并且我想从文件call.c 中调用它。我怎样才能完成这项任务?
【问题讨论】:
例如:
typedef struct
{
int SomeMemberValue;
char* SomeOtherMemberValue;
} SomeStruct;
int SomeReferencedFunction(int someValue, SomeStruct someStructValue);
int SomeFunction()
{
SomeStruct s;
s.SomeMemberValue = 12;
s.SomeOtherMemberValue = "test string";
return SomeReferencedFunction(5, s) > 12;
}
有一个功能可以让您重用这些前向声明,称为Header Files。只需将前向声明放在头文件中,然后使用#include 将它们添加到您引用前向声明的每个 C 源文件中。
/* SomeFunction.c */
#include "SomeReferencedFunction.h"
int SomeFunction()
{
SomeStruct s;
s.SomeMemberValue = 12;
s.SomeOtherMemberValue = "test string";
return SomeReferencedFunction(5, s) > 12;
}
/* SomeReferencedFunction.h */
typedef SomeStruct
{
int SomeMemberValue;
char* SomeOtherMemberValue;
} SomeStruct;
int SomeReferencedFunction(int someValue, SomeStruct someStructValue);
/* SomeReferencedFunction.c */
/* Need to include SomeReferencedFunction.h, so we have the definition for SomeStruct */
#include "SomeReferencedFunction.h"
int SomeReferencedFunction(int someValue, SomeStruct someStructValue)
{
if(someStructValue.SomeOtherMemberValue == NULL)
return 0;
return someValue * 12 + someStructValue.SomeMemberValue;
}
当然,为了能够编译这两个源文件,进而编译整个库或可执行程序,您需要将两个 .c 文件的输出添加到链接器命令行,或者将它们包含在同一个“项目”(取决于您的 IDE/编译器)。
许多人建议您为所有前向声明制作头文件,即使您认为不需要它们。当您(或其他人)去修改您的代码并更改函数的签名时,它将节省他们必须修改函数被前向声明的所有位置的时间。它还可以帮助您避免一些细微的错误,或者至少是令人困惑的编译器错误。
【讨论】:
您可以在文件func1.h 中声明函数,并在call.c 中添加#include "func1.h"。然后将func1.c 和call.c 编译或链接在一起(具体取决于哪个C 系统)。
【讨论】: