通常所说的翻译单元的定义是在预处理之后(包括头文件包含、宏等与源文件一起的内容)。这个定义很清楚,C标准(5.1.1.1,C11)指出:
C程序不必同时被翻译。本国际标准中,程序文本保存在称为源文件(或预处理文件)的单位中。一个源文件加上通过预处理指令
#include
包含的所有头文件和源文件就被称为预处理翻译单元。在预处理之后,预处理翻译单元就称为翻译单元。
更仔细地阅读第一句话:
C程序不必同时被翻译。
这意味着(按我的理解),C程序可以在同一时间进行翻译,而不一定将它们拆分为多个预处理源文件。同样在该段落的末尾,标准还说:
可以单独翻译翻译单元然后将它们链接在一起以生成可执行程序。
这可以(并且通常被解释为)编译单个目标文件,然后最终将它们链接在一起以生成单个可执行程序。但是,如果将以上语句提问并问:这是否意味着实现可以将多个源文件视为单个翻译单元,特别是对于以下调用:
gcc file1.c file2.c -o out
编译器可以访问整个源代码的地方是哪里?
特别地,如果一个实现将file1.c
+file2.c
(上面的代码)视为单个翻译单位,那么它是否可以被认为是不符合标准的?
gcc file1.c file2.c
是否导致GCC将它们视为单个TU完全取决于GCC。我的意思是,cat file1.c file2.c
将它们连接起来;如果gcc
感觉提供类似cat
的功能,那么这样做是合法的。用户手册可以记录该选择。C编译器仍然可以存在于不存在“文件系统”中的“文件”驻留的上下文中。标准只选择称呼这些“单元”为_文件_。它不要求它们实际上是常见理解中术语的文件。 - Iwillnotexist Idonotexist