我是否必须包含包含函数定义的C文件?

时间:2018-07-26 00:43:37

标签: c linker include declaration extern

所以我一直在读书,我在使用C中的extern关键字是否仍遇到麻烦。

例如: 我有一个名为 main.c 的文件,并且在其中声明了一个函数 int add(int a,int b); (在使用之前)。但是,函数的定义位于 math.c 中。这是否意味着我必须在main.c(#include math.c / h)或main.h文件中包含math.c和/或math.h文件才能使用该函数而不会引起编译时错误?还是仅声明函数 int add(int a,int b)就足够了?

简而言之:我必须包含定义函数声明的文件吗?

此外,如果仅声明函数就足够了,这是一种好习惯,还是链接程序会照顾它?

谢谢。

1 个答案:

答案 0 :(得分:2)

您应在“ main.c”中包括“ math.h”,并将add的定义放在“ math.h”中:int add(int a, int b);

然后还将“ math.h”包含在“ math.c”中,并通过创建执行计算的代码在该文件中实际声明add

然后,编译器将两个.c文件分别编译为Linux / MacOS下的.o文件或Windows下的.obj文件。然后,链接器获取这两个.o / .obj文件,并将它们链接在一起以生成完整的可执行文件。

通常,扩展名为.h的头文件应包含在多个.c文件中,并提供有关在相应.c文件中可以找到的内容的信息。因此,math.h包含add的原型,这使main.c知道该函数,因此可以正确使用它,而math.c包含实际代码。

虽然不是绝对必需的,但从长远来看,遵守此约定将使您更轻松,尤其是当您的大型项目中包含许多.c.h文件时。这就是为什么您会发现它几乎在您下载的所有开源项目中都得到使用。

-编辑-

通常,也不要直接在.c文件中包含外部定义。始终尝试将它们放在.h头文件中。如果您的项目中有100个或更多.c文件,并且将它们直接放置在.c文件中会造成维护噩梦,并且您决定需要更改函数原型。现在,您不必编辑单个.h .c对,而是必须编辑无数个单独的.c文件。这将很容易出错。