出于这个问题的目的,我只对符合标准的 C++ 感兴趣,而不是 C 或 C++0x,也不对任何特定于实现的细节感兴趣。
#include ""
关于和之间的区别的问题不时出现#include <>
。该论点通常归结为两个差异:
- 具体实现往往会为这两种形式搜索不同的路径。这是特定于平台的,不在此问题的范围内。
- 该标准说
#include <>
是针对“标题”,而#include ""
针对“源文件”。以下是相关参考:
ISO/IEC 14882:2003(E)
16.2 源文件包含[cpp.include]
1 #include 指令应标识可由实现处理的头文件或源文件。
2形式的预处理指令
在一系列实现定义的位置中搜索由 < 和 > 分隔符之间的指定序列唯一标识的标头,并用标头的全部内容替换该指令。如何指定位置或标识的标头是实现定义的。# include < h-char-sequence > new-line
3形式的预处理指令
导致将该指令替换为由 " 分隔符之间的指定序列标识的源文件的全部内容。以实现定义的方式搜索命名的源文件。如果不支持此搜索,或者搜索失败, 该指令被重新处理,就好像它读取# include "q-char-sequence" new-line
具有与原始指令相同的包含序列(包括 > 字符,如果有的话)。# include < h-char-sequence > new-line
(上面引用的重点是我的。)这种差异的含义似乎是标准打算区分“标题”和“源文件”,但文档没有定义这些术语或它们之间的区别.
很少有其他地方甚至提到头文件或源文件。一些:
158)标题不一定是源文件,由标题名称分隔的序列也不一定是有效的源文件名(16.2)。
似乎暗示头文件可能不驻留在文件系统中,但它也没有说源文件存在。
2 词汇约定 [lex]
1程序文本保存在本国际标准中称为源文件的单元中。源文件连同通过预处理指令包含的所有头文件 (17.4.1.2) 和源文件 (16.2)
#include
,减去由任何条件包含 (16.1) 预处理指令跳过的任何源代码行,称为翻译单元。[注意:一个 C++ 程序不需要同时翻译。]
这是我能找到的最接近定义的,它似乎暗示标题不是“程序的文本”。但是如果你#include
是一个标题,它不会成为程序文本的一部分吗?这有点误导。
那么什么是标头?什么是源文件?