如果我在文件
func1.c
中定义了一个函数,我想从文件call.c
中调用它,我该如何完成这个任务?func1.h
中放置该函数的声明,并在call.c
中添加#include "func1.h"
。 然后你需要将func1.c
和call.c
进行编译或链接(具体细节取决于使用的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;
}
有一种功能可以让您重复使用这些前向声明,这被称为头文件。只需将前向声明放置在头文件中,然后使用#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/编译器)。
许多人建议为所有前向声明创建头文件,即使你认为自己不需要。当你(或其他人)修改代码并更改函数的签名时,这将节省他们修改所有函数前向声明位置的时间。这也可以帮助你避免一些微妙的错误,或者至少避免令人困惑的编译器错误。