- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
翻译单元 的常用定义是预处理后的内容(头文件包含、宏等以及源文件)。这个定义相当清楚,C 标准 5.1.1.1,C11 说:
A C program need not all be translated at the same time. The text of the program is kept in units called source files, (or preprocessing files) in this International Standard. A source file together with all the headers and source files included via the preprocessing directive
#include
is known as a preprocessing translation unit. After preprocessing, a preprocessing translation unit is called a translation unit.
仔细阅读第一句话:
A C program need not all be translated at the same time.
这意味着(根据我的阅读),一个 C 程序可以被同时翻译,而不必将它们拆分成多个预处理源文件。同样在同一段的末尾,标准说:
Translation units may be separately translated and then later linked to produce an executable program.
这可以(通常是)解释为编译单个目标文件,然后最终将它们链接以生成单个可执行程序。但是,如果有人可以从上述陈述中提出问题并提出疑问:这是否意味着实现可以自由地将多个源文件视为单个翻译单元,尤其是对于像这样的调用:
gcc file1.c file2.c -o out
编译器在哪里可以访问整个源代码?
特别是,如果一个实现将 file1.c
+ file2.c
(上文)视为单个翻译单元,是否可以将其视为不合格?
最佳答案
在你引用的第二行中:
The text of the program is kept in units called source files, (or preprocessing files) in this International Standard
如果有两个源文件,则有两个预处理文件,因此有两个预处理翻译单元,因此有两个翻译单元。每个源文件对应一个。
标准没有定义源文件。我猜编译器可能会说“我正在通过声明 file1.c
和 file2.c
毕竟不是源文件来构建我自己的‘源文件’版本!”并将它们连接起来,但这与程序员的期望不一致。我认为您很难争辩说 file1.c
不是源文件。
关于c - C中的翻译单元到底是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42262802/
这对你们来说可能很简单,但由于我是java新手,所以我想知道实际上什么是 接下来的部分会发生什么? if (args.length > 0) { file = args[0]; } publi
在我的 View Controller 中,我将 UITapGestureRecognizer 添加到 self.view。我在 self.view 之上添加了一个小 View 。当我点击小 View
我今天尝试从 Obj-C 开始并转到 Swift,我正在阅读文档。我试图在 Swift 中创建一个简单的 IBOutlet,但它不断给我这些错误。 View Controller 没有初始化器 req
我正在尝试使用 VIM 完成(字典和当前缓冲区),但我遇到了问题?和 !在方法名称的末尾。我能以某种方式向 vim 解释方法名称(基本上是单词)最后只能有它,而且只有一个,即 method_name
我是一名优秀的程序员,十分优秀!