如何在一个文件中定义C函数,然后从另一个文件中调用它?

29
如果我在文件func1.c中定义了一个函数,我想从文件call.c中调用它,我该如何完成这个任务?
2个回答

30
你需要在文件func1.h中放置该函数的声明,并在call.c中添加#include "func1.h"。 然后你需要将func1.ccall.c进行编译或链接(具体细节取决于使用的C系统)。

哦,好的,这就像Java中的接口一样,如果C语言能像Java那样就更好了。 - anshulkatta
你可能想看一下C++/C#。 - Wreigh

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;
}

有一种功能可以让您重复使用这些前向声明,这被称为头文件。只需将前向声明放置在头文件中,然后使用#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/编译器)。

许多人建议为所有前向声明创建头文件,即使你认为自己不需要。当你(或其他人)修改代码并更改函数的签名时,这将节省他们修改所有函数前向声明位置的时间。这也可以帮助你避免一些微妙的错误,或者至少避免令人困惑的编译器错误。


@Sam H:还要注意的是,您可以在同一源文件中拥有前向声明和实际定义。它仍然可以工作。这对于代码组织非常有帮助,因此您不必按照使用顺序编写函数。当您有两个相互调用的函数时,这也很有帮助。 - Merlyn Morgan-Graham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接