什么是C ++中的“翻译单元”
我正在阅读Meyers写的“Effective C ++”,碰到“翻译部门”这个词。
请有人给我一个解释:
1)究竟是什么
2)什么时候应该考虑在使用C ++编程时使用它
3)如果它仅与C ++相关,或者可以与其他编程语言一起使用
我可能已经使用它,不知道术语….
从这里 :(回单机链接 )
根据标准的C ++ ( wayback machine link ):翻译单元是C ++编译的基本单元。 它由单个源文件的内容,以及直接或间接包含的所有头文件的内容,减去使用条件预处理语句忽略的那些行组成。
单个翻译单元可以被编译成目标文件,库或可执行程序。
在“一个定义规则”和模板的背景下,最经常提到翻译单元的概念。
一个翻译单元是为了所有意图和目的的一个文件(.c / .cpp),包括所有的头文件。
http://msdn.microsoft.com/en-us/library/bxss3ska%28VS.80%29.aspx
一个很难回答的问题。 C ++标准规定:
本标准中的程序文本保存在源文件中。 通过预处理指令#include包含所有头文件(17.4.1.2)和源文件(16.2)的源文件,而不是任何有条件包含(16.1)预处理目录中跳过的任何源代码行称为翻译单元。 [注意:一个C ++程序不需要全部同时翻译。 ]
因此,对于大多数意图和目的,翻译单元是一个单独的C ++源文件,以及通过预处理器#include机制包含的头文件或其他文件。
关于你的其他问题:
2)什么时候应该考虑在使用C ++编程时使用它
你不能不考虑它 – 翻译单位是一个C ++程序的基础。
3)如果它仅与C ++相关,或者可以与其他编程语言一起使用
其他语言有相似的概念,但是它们的语义会有细微的差别。 例如,大多数其他语言不使用预处理器。
这本书很清楚。 当迈耶斯指责“翻译部门”时,他指的是一个源代码文件。
除了ODR之外,翻译单元在未命名的命名空间的定义中是重要的,它取代了“静态”的旧用法之一。
我想我还是没有足够的积分在顶部的答案下添加评论。
翻译单元是传递给编译器的代码。 这通常意味着在.c文件上运行预处理器的输出。
根据MSDN :C和C ++程序由一个或多个源文件组成,每个源文件包含程序的一些文本。 源文件及其包含文件(包含使用#include预处理程序指令的文件),但不包括由条件编译指令(如#if)删除的代码段称为“翻译单元”。
C和C ++程序由一个或多个源文件组成,每个源文件包含程序的一些文本。 源文件及其包含文件(包含使用#include预处理程序指令的文件),但不包括由条件编译指令(如#if)删除的代码段称为“翻译单元”。
每个cpp / c(实现)文件都将被转换成一个翻译单元(即,目标文件(.obj)),cpp文件中的头文件将被头文件中的实际文本replace。
正如其他人所说,翻译单位基本上是预处理后的源文件的内容。 这是语言语法中最重要的一部分。 如果您正在编写C或C ++编译器,则只需要担心它。
在我看来,“翻译单元”通常是一个单独的“后期预处理”源文件。 你可以在这个MSDN页面上获得更多的细节。 http://msdn.microsoft.com/en-us/library/bxss3ska(v=vs.80).aspx