什么是C++中的"翻译单元"

Har*_*rry 221 c++

我正在阅读Meyers编写的"Effective C++",并且遇到了"翻译单元"一词.

有人可以给我一个解释:

1)究竟是什么

2)在使用C++编程时,我应该何时考虑使用它

3)如果它只与C++有关,或者它可以与其他编程语言一起使用

我可能已经在不知道术语的情况下使用它了....

Jef*_*ffH 249

这里 :(返回机器链接)

根据标准C++(wayback machine link):翻译单元是C++中编译的基本单元.它由单个源文件的内容,以及它直接或间接包含的任何头文件的内容组成,减去那些使用条件预处理语句忽略的行.

单个翻译单元可以编译为目标文件,库或可执行程序.

翻译单元的概念通常在"一个定义规则"和模板的上下文中提及.

  • 该术语仅用于C/C++吗? (9认同)
  • @dekuShrub 事实上,不。例如,在 Rust 中,翻译单元是一个板条箱,在 C++ 中,同样的东西将被称为整个库。这个术语本身是通用的,但它肯定是从 C 开始的。 (3认同)
  • 新参考大致说明了这个答案的内容:https://en.wikipedia.org/wiki/Translation_unit_(programming) (2认同)

Ana*_*tts 63

翻译单元用于所有意图和目的,文件(.c/.cpp)完成包括所有头文件之后.

http://msdn.microsoft.com/en-us/library/bxss3ska%28VS.80%29.aspx

  • 您可以编译以".h"结尾的文件.文件名根本不重要.内容是.如果"foo.h"的内容是"int main(){}",则可以编译它. (10认同)
  • 包括头文件.即使没有生成代码,编译器也会处理头文件.另请参阅JeffH的预处理器注释,"编译器看到的所有内容"定义都很好. (3认同)
  • @JohannesSchaub-litb我认为你的意思是链接,而不是编译。您可以编译任何文件,只要它是正确的 C/C++ 并定义了所有名称即可。编译头文件是没有用的,因为头文件的全部意义在于包含(读取复制)到源文件中,因此当您编译包含它的源文件时,它们已经被编译。我想你的意思是你不能从没有 main 函数的文件创建可执行文件。 (2认同)

小智 27

一个难以回答的难题.C++标准规定:

该程序的文本保存在本国际标准中称为源文件的单元中.通过预处理指令#include将源文件与所有头文件(17.4.1.2)和包含的源文件(16.2)相结合,减去任何条件包含(16.1)预处理指令跳过的任何源代码行,称为转换单元.[注意:C++程序不需要同时进行翻译.]

因此,对于大多数意图和目的,翻译单元是单个C++源文件以及它通过预处理器#include机制包含的头文件或其他文件.

关于你的其他问题:

2)在使用C++编程时,我应该何时考虑使用它

你不能不考虑它 - 翻译单元是C++程序的基础.

3)如果它只与C++有关,或者它可以与其他编程语言一起使用

其他语言也有类似的概念,但它们的语义会略有不同.例如,大多数其他语言不使用预处理器.

  • @GMan注意标准使用的两个术语:"标题"和"源文件"."header"仅用于标准库.某些代码包含的用户文件不是标准称为"标题",而是"源文件".标准不知道我们可怜的c ++程序员组成的".h"和".cpp"之间的区别:) (6认同)

Ed *_* S. 9

这本书很清楚.当Meyers参考"翻译单元"时,他指的是源代码文件.

  • @Dan:不,不是。翻译单元是包含后*可*编译的源文件,即编译前预处理器的输出。 (4认同)
  • @Dan:翻译单元就是标准所说的。我并不真正关心随机编译器开发人员的意见。有趣的是,那个挖出一个将近五年前的帖子来挑剔并告诉我我的定义是错误的人转过身来称我为“语言纳粹”以纠正他的观点。是的,继续前进,你很累。 (3认同)

sig*_*ice 6

翻译单元是传递给编译器的代码。这通常意味着在 .c 文件上运行预处理器的输出。


All*_*kes 5

除了 ODR 之外,翻译单元在未命名命名空间的定义中也很重要,它取代了“静态”的旧用法之一。

我想我仍然没有足够的分数在最佳答案下添加评论。