我应该在哪里列出c和makefile中的标题

时间:2014-08-28 18:45:40

标签: c makefile header-files

我正在学习如何将C代码拆分成多个文件。我不太了解的是我必须在哪里指定头文件。如果我理解正确,必须在

中列出函数的头文件
  1. 函数的源文件,使用#include
  2. 使用#include
  3. 调用该函数的任何代码
  4. Makefile,作为#include头文件的每个文件的依赖项。
  5. 这对我来说似乎是多余的。我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:3)

严格来说,我不相信需要在函数的源文件中,但我相信如果不这样做,你会收到许多常见编译器标志的警告。 (我也错了。)

你在其他使用该函数的文件中绝对需要它,以便编译器可以正确知道函数的签名是什么(它必须猜测否则它会 猜错并犯错误,因为那个)。事情可能仍然有效,但这并不能保证,也不值得信赖。

你需要在makefile中列出它,以便make知道如果头文件发生变化需要重建目标文件(源文件的依赖性通常隐含在规则本身但是头文件不属于那)。在makefile中手动列出所有这些都是乏味的,这就是编译器帮助你做到这一点的原因,以及为什么像autotools(以及其他类似的框架)这样的东西会为你自动化大部分内容。有关此问题的讨论,请参阅Advanded Auto-Dependency Generation

简而言之,不,你没有错过任何东西,但它并不像你想象的那样烦人。

答案 1 :(得分:1)

实际上只有2是非常必要的,因为外国代码显然需要看到函数声明。

1。如果除了希望外部和定义翻译单元可用的函数原型之外还有其他声明,则可能需要这些声明。当然,这也确保了头文件和源文件中的原型一致。

假设与GNU兼容的工具链,您不需要在3.中手动列出标头依赖项,而是通过-MMD或类似方法在编译时自动生成它们,并通过

包含生成的文件
-include $(DEPS)

其中DEPS类似于$(wildcard *.d)$(OBJECTS:%.o=%.d),具体取决于您构建makefile的具体程度。

答案 2 :(得分:0)

为避免冗余,您可以将多个可能在一个标题中一起使用的函数的头文件分组:

/* file foofuncs.h */
#include <foo.h>
#include <foo2.h>
[...]

然后只包括伞头:

#include <foofuncs.h>

在Makefile中添加一个目标:

foofuncs.h: foo.h foo2.h [...]
    touch foofuncs.h
cippa.o: cippa.c foofuncs.h
lippa.o: lippa.c foofuncs.h bar.h [...]

在足够小的项目中,我对整个程序使用单个unbrella头。