标头包含多个C文件

时间:2011-08-05 22:11:19

标签: c header-files

我有两个文件foo.c和bar.c,我用gcc -c单独编译然后链接。这两个文件都需要stdio.h和stdlib.h头文件。

我是否必须将它们包括在内?不觉得有点多余吗?我应该使用#ifdef吗?

最佳做法是什么?

5 个答案:

答案 0 :(得分:17)

每个C文件都是不同的翻译单元。换句话说,它是整个单独的程序,语法上完整和正确。因此,每个C文件必须独立于任何其他C文件编译,并且必须包含它使用的每个标识符的每个声明,而不管这些声明是否也出现在其他C文件中。从编译器的角度来看,每个C文件本身都是一个完整的程序(尽管有未解析的引用)。

按照惯例,

头文件是包含必须出现在一组C文件中的声明的文件。头文件可以包含在预处理器中 - 这是在包含点进行简单的文本复制和粘贴 - 以避免手动复制翻译单元之间的声明。

总结:在不同的C文件中包含相同的文件并不是多余的 - 这是正式要求的。

(之后,你链接目标文件,它们只是较小的程序,进入一个较大的最终程序。较大的程序大致是较小的子程序的总和,所有引用都在它们之间解决。一般来说,链接阶段对生成结果对象文件的原始文件的语言结构一无所知。)

答案 1 :(得分:2)

您必须在两个文件中包含标头。标头只是函数声明和常量声明的列表。编译器需要这些以确保您的语法和函数调用是正确的。

答案 2 :(得分:1)

头文件应该(并且将)有一个#ifndef包装器以防止出现此问题(问题实际上是循环包含 - 你包括 - > foo.h包括bar.h bar.h包括foo.h) 。

在您的情况下,实际上需要“重复”包含(对于函数原型,结构定义),因为(正如您所说)两个文件都是单独编译的。 foo.c的编译过程对bar.c的编译一无所知。

答案 3 :(得分:0)

您必须将标题包含在自行编译的任何文件中,即使您稍后将其链接也是如此 标题中已经有#ifdef,因此它实际上只会使用一次。

答案 4 :(得分:0)

是的,你必须将它们都包括在内。我主要使用C ++工作,我尝试尽可能在我的.cpp文件中包含文件,只有在我必须时才在.h文件中。这通常意味着在.h文件中执行某种类型的前向引用。

我参与过的一些平台会创建一个包含大量标准文件的.h,以便您可以只包含一个文件。就个人而言,我从来没有特别喜欢这种方法。

你写的每个.h文件应该有所谓的“包含警卫”。这些#ifdef语句可以防止标题被多次包含。你会注意到你提到的那些已经包括警卫了。但请确保将它们放在foo.h和bar.h中。