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

Do I have to include the C file that contains the definition for a function?

所以我一直在做一些阅读,我是否仍然在使用 C 中的 extern 关键字时遇到问题。

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

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

此外,如果仅仅声明函数就足够了,这是好习惯,还是链接器会处理它?

谢谢。

您应该在 "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 文件中,并提供有关在相应的 [=14= 中可以找到的内容的信息] 文件。所以 math.h 包含所谓的 add 的原型,这允许 main.c 了解该函数,因此它能够正确使用它,并且 math.c 包含实际代码。

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

-- 编辑--

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