假设我在文件func1.c
中定义了一个函数,我想从文件call.c
中调用它,
我怎么做到这一点?提前谢谢!
答案 0 :(得分:30)
您可以在文件func1.h
中添加该函数的声明,并在#include "func1.h"
中添加call.c
。然后,您将编译或链接func1.c
和call.c
在一起(详细信息取决于哪个C系统)。
答案 1 :(得分:12)
例如:
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 /编译器)。
许多人建议您为所有前向声明制作头文件,即使您认为不需要它们也是如此。当您(或其他人)去修改您的代码并更改函数的签名时,它将节省他们修改函数前向声明的所有位置的时间。它还可以帮助您避免一些微妙的错误,或者至少使编译器错误混乱。