我使用#pragma一次(或者你使用includeguardsàla#ifndef …)基本上在我的c项目的每个头文件中.这是巧合还是你在大多数开源项目中找到的(例如,避免只依赖于个人项目经验的答案).如果是这样,为什么不相反:如果我想要多次包含头文件,我使用相同的特殊预处理器命令,如果不是,我将文件原样保留.
解决方法
C编译器的行为是根据它如何处理每个转换单元来指定的.翻译单元是预处理器在其上运行后的单个文件.事实上,我们有一个在某些文件中收集声明并将它们称为“头”文件的约定,这对编译器或C标准来说毫无意义.
简单地说,该标准没有提供“头文件”,因此它不能提供自动包含保护头文件.该标准仅提供预处理器指令#include,其余仅仅是约定.没有什么可以阻止你向前声明所有内容并且不使用头文件(除了怜悯任何人应该维护该代码……).
所以头文件不是特别的,没有办法说“这是一个头文件,守护它”,但为什么我们不能保护所有获得#include’d?因为#include比其他语言的模块系统更强大. #include使预处理器粘贴到其他文件中,不一定是头文件.有时,如果在不同文件中的一堆不同命名空间中使用相同的using和typedef声明,这可能很方便.你可以在一个文件中收集它们并在一些地方#include它们.您不希望自动包含防护措施阻止您这样做.
使用#ifndef和#define有条件地包含头也只是惯例.该标准没有“包括警卫”的概念. (然而现代编译器实际上都知道包括警卫.识别包括警卫可以允许更快的编译,但它与正确实现标准无关.)
变得迂腐
该标准确实使用了“header”这个词,特别是在参考C和C标准库时.但是,#include的行为是在§16.2*源文件*包含(emph.mine)下定义的,并且它不对头文件授予任何特殊权限.
努力将适当的模块系统纳入C标准.