C11标准中的源文件是什么?

3
我对C11标准中这段话的一个句子有疑问:
5.1.1.1程序结构
“C程序不需要一次性全部翻译。该国际标准将程序文本保存在称为源文件(或预处理文件)的单元中。通过预处理指令#include包含的源文件和头文件组成了预处理翻译单元。”
首先它说程序文本保存在称为源文件的单元中。 接着它说,源文件连同头文件和通过预处理指令#include包含的源文件被称为预处理翻译单元。
那么,源文件是与头文件不同的实体,还是源文件包括两者?

1
它只是说一个源文件可以包含多个其他文件,包括头文件、其他源文件,一旦所有这些都被包含进来,那么就是一个PTU。 - Keith Nicholas
所以对于你来说,源文件和头文件是不同的实体... - xdevel2000
3个回答

4
一个“源文件”是任何包含源代码的文本文件(或其他特定于实现的实体,根据Basile的回答)。这特别包括.c.h文件。它还可能包括具有其他后缀的文件,例如预处理器或生成的代码文件。
当您使用实际传递给编译器的某个源文件(因此通常仅限于.c文件)时,该文件与(其#include的传递闭包)一起形成一个“翻译单元”。
因此:每个翻译单元都由源文件构建。
但是:并非每个源文件都是翻译单元的起点。

2
从严格意义上讲,源文件(按照C99或C11标准的定义)甚至不一定是一个文件(按照操作系统的定义)。符合规范的实现可以从数据库或某些程序内部的常量字符串中读取“源文件”。
据传闻,20世纪90年代IBM的某个专有编译器(VisualAge???)曾经从某个数据库获取源代码进行编译。如今,tinycc也提供了一个名为libtcc的库以及一个tcc_compile_string函数来编译字符串。TinyCC能够快速地将源代码编译成的机器码。
实际上,在同一次编译或翻译单元中通常会处理多个源文件(例如.h.c文件)。
据我了解,C语言标准中有趣的一点是它们并不假定实现中必须有一个文件系统。我相信标准甚至不需要计算机;你可以使用一群人类奴隶不道德地实现标准,但这是不道德和低效的。

1
术语“源文件”(或“预处理文件”)指的是 .c 源文件和 .h 标头。 C标准没有将它们区分开来。
在K·N·金的《C编程:现代方法》一书中明确提到了这一点(第15.2节)。

1
这是一个有趣的观点;标准还指出:“头文件不一定是源文件,头文件名中用尖括号括起来的序列也不一定是有效的源文件名。”。 - xdevel2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接