我对C99标准草案中的描述感到困惑。第 5.1.1.1 节,程序结构,指出:
源文件以及通过预处理包含的所有标头和源文件 指令
被称为预处理翻译单元。#include
该描述听起来像是两个或多个实体(即源文件及其依赖项)的组合(暗示为“一起”)被称为另一个实体(即预处理翻译单元,如下 PTU)。我不确定我是否可以说:
PTU 是一个源文件,包含通过预处理指令包含的所有标头和源文件
。#include
如果上面这句话为真,那么下面的源文件属于哪个单元?
/* do-nothing.c */
#define foo 3
int main(void) { return foo; }
上面的文件不与任何头文件或其他源文件在一起,但可以对其进行预处理。
我再举一个例子:
在我看来,第二句话没有提供表达式的定义,因为表达式可以包含零个或多个运算符。
“#include”的作用是将指定文件的内容复制粘贴到当前文件中 - 不多也不少。链接器(在实际编译后运行)不使用它。
因此,预处理器翻译单元是“将包含的文件复制到文件中后文件中的所有内容”。标头后面的实现不是 PTU 的一部分。