迂腐:什么是源文件?什么是标题?

Joh*_*ing 16 c++ language-lawyer

出于这个问题的目的,我只对标准兼容的C++感兴趣,而不是C或C++ 0x,而不是任何特定于实现的细节.

问题从不时出现有关之间的差异#include ""#include <>.这个论点通常归结为两个不同之处:

  1. 具体实现通常搜索两种形式的不同路径.这是特定于平台的,不在本问题的范围内.
  2. 标准说#include <>是"标题",而是#include """源文件".以下是相关参考:

ISO/IEC 14882:2003(E)

16.2源文件包含[cpp.include]

1 #include指令应标识可由实现处理的头文件或源文件.

2表单的预处理指令

# include  < h-char-sequence > new-line
Run Code Online (Sandbox Code Playgroud) 搜索的实现所定义的地方的序列为一个标头由<和>分隔符之间的指定序列唯一地标识,并且使得由标题的全部内容替换该指令的.如何指定场所或标识的头是实现定义的.

3表单的预处理指令

# include "q-char-sequence" new-line
Run Code Online (Sandbox Code Playgroud) 导致由"delimiters"之间的指定序列标识的源文件的全部内容替换该指令.以实现定义的方式搜索指定的源文件.如果不支持此搜索,或者搜索失败,该指令被重新处理,就像它读取一样
# include  < h-char-sequence > new-line
Run Code Online (Sandbox Code Playgroud) 使用原始指令中相同的包含序列(包括>字符,如果有的话).

(上面引用的重点是我的.)这种差异的含义似乎是标准打算区分"标题"和"源文件",但文档中没有一个定义这些术语中的任何一个或它们之间的区别.

其他几个地方甚至没有提到标题或源文件.一些:

158)标题不一定是源文件,标题名称中分隔的序列也不一定是有效的源文件名(16.2).

似乎暗示标题可能不在文件系统中,但它也没有说源文件.

2词汇约定[lex]

1该程序的文本保存在本国际标准中称为源文件的单元中.通过预处理指令将源文件与所有头文件(17.4.1.2)和包含的源文件(16.2)一起#include,减去任何条件包含(16.1)预处理指令跳过的任何源代码行,称为转换单元.[注意:C + +程序不需要同时翻译.]

这是我能找到的最接近定义的内容,它似乎暗示标题不是"程序的文本".但如果你#include是一个标题,它不会成为该程序文本的一部分吗?这有点误导.

什么是标题?什么是源文件?

Der*_*urk 8

我的阅读是使用<>尖括号包含的标准标题不一定是文件系统上的实际文件; 例如,一个实现可以自由地启用一组"内置"操作,提供iostream它何时看到的功能#include <iostream>.

另一方面,包含的"源文件" #include "xxx.h"旨在是驻留在文件系统上的文字文件,以某种依赖于实现的方式搜索.

编辑:回答你的具体问题,我认为"头"仅限于那些#include在标准规定的能设施:iostream,vector---或者执行情况对标准的扩展和朋友."源文件"可以是.h程序员可以编写或使用的任何非标准工具(如文件等).

  • @John:这显然是实现定义的,因为显然不能保证`<>`会寻找实际的文件. (3认同)

小智 4

这不是说头可以作为源文件实现,但又可能不存在吗?至于“什么是源文件”,考虑到“文件”的实现方式有多种,标准不明确说明这一点似乎是非常明智的。