我对标准C11的这一段中的一句话表示怀疑:
5.1.1.1程序结构
C程序不需要同时翻译。的文本 程序保存在称为源文件的单元中(或预处理 在本国际标准中。源文件与所有 通过预处理指令#include包含的头文件和源文件称为预处理翻译单元。
首先,它表示程序的文本保存在称为源文件的单元中。 之后它说源文件连同头文件和源文件被称为预处理翻译单元。
源文件是否与头文件或源文件不同,实体包括两者?
答案 0 :(得分:4)
源文件是包含源代码的任何文本文件(或其他特定于实现的实体,根据Basile的回答)。这具体包括.c
和.h
文件。它还可能包含带有其他后缀的文件,如预处理程序或生成的代码文件。
当您将一些源文件实际传递给编译器时(通常只有.c
个文件),该文件与(传递闭包)一起#include
形成一个翻译单元
所以:每个翻译单元都是由源文件构建的。
但是:并非每个源文件都是翻译单元的起点。
答案 1 :(得分:2)
迂腐地说,源文件(在C99或C11标准意义上)甚至不一定是文件(在操作系统意义上)。符合标准的实现可以从数据库中读取“源文件”或在某个程序中读取一些常量字符串。
据传,20世纪90年代的一个专有IBM编译器(VisualAge ???)从某个数据库获得了编译源代码。今天,tinycc还为libtcc
库提供了函数tcc_compile_string
来编译字符串。 TinyCC正在快速编译成慢机器代码。
实际上,通常会有多个源文件(例如.h
和.c
文件)在同一个编辑或translation unit内处理。
IIUC,关于C标准的有趣之处在于它们并不假设实现的文件系统具有。我相信标准甚至不需要电脑;你可能会使用一堆人类奴隶来不道德地实施这个标准,但这是不道德和低效的。
答案 2 :(得分:1)
术语源文件(或预处理文件)反映了.c
源文件和.h
标头。 C标准不区分它们。
在K. N. King的“C编程:现代方法”一书(第15.2节)中明确提到。