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

时间:2010-11-24 21:28:50

标签: c file function call

假设我在文件func1.c中定义了一个函数,我想从文件call.c中调用它, 我怎么做到这一点?提前谢谢!

2 个答案:

答案 0 :(得分:30)

您可以在文件func1.h中添加该函数的声明,并在#include "func1.h"中添加call.c。然后,您将编译或链接func1.ccall.c在一起(详细信息取决于哪个C系统)。

答案 1 :(得分:12)

使用Forward Declaration

例如:

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 /编译器)。

许多人建议您为所有前向声明制作头文件,即使您认为不需要它们也是如此。当您(或其他人)去修改您的代码并更改函数的签名时,它将节省他们修改函数前向声明的所有位置的时间。它还可以帮助您避免一些微妙的错误,或者至少使编译器错误混乱。