C++ 编译与翻译单元

Posted

技术标签:

【中文标题】C++ 编译与翻译单元【英文标题】:C++ compilation vs translation unit 【发布时间】:2021-11-25 06:38:57 【问题描述】:

我正在准备一个关于工作模板的简短演示,并使用 isocpp.org 作为内容的起点。但是,我遇到了一个有趣的段落:

给专家的说明:我显然在上面做了一些简化。这是故意的,所以请不要大声抱怨。如果您知道 .cpp 文件和编译单元之间的区别,类模板和模板类之间的区别,以及模板真的不仅仅是美化的宏这一事实,那么不要抱怨:这个特定的问题/答案一开始不是针对你的。我简化了一些事情,以便新手能够“理解”,即使这样做会冒犯一些专家。

有几件事让我感到困惑,其中之一是 .cpp 文件与编译单元。

我读过一个 .cpp 文件被称为“翻译单元”。但究竟什么是编译单元?

我发现this 回答说翻译和编译单元是一回事,基本上只是单个 .cpp 文件的花哨名称,但 isocpp 似乎不这么认为,即使我搜索“编译单元”。 Wikipedia 似乎提到了“单一编译单元”模型,但没有提供关于什么是编译单元的具体信息。

那么什么是编译单元,它与翻译单元有何不同(翻译单元与 .cpp 文件是否 100% 相同)?

【问题讨论】:

首先,翻译和编译单元是一回事。单词/短语翻译单元比编译单元更常用。这基本上意味着您的源文件包括它的所有头文件。 第二我们(我指的是好的 C++ 书籍)使用术语 function templateclass template 而不是使用术语“模板函数”和“模板类”。 没有“编译单元”这样的东西。这只是草率的措辞。 @AnoopRana 谢谢你的回复。我也有同样的印象,但我认为您可以同意,该措辞清楚地暗示存在差异,因此我感到困惑。除此之外,它在 isocpp 上的事实确实赋予了该声明一定的权重。您在 C++ 文档中所说的内容是否有来源? @RaresDima 你说“它在 isocpp 上的事实确实给了声明一定的权重”。你能给我们一个链接,isocpp 是这么说的吗? @RaresDima 在您提供的链接中,我只能找到您在上面引用的相同声明。 那里没有说“翻译和编译单元不同”。另请注意,单独的 cpp 文件并不构成翻译/编译单元。另一方面,包含所有头文件的 cpp 文件构成了一个翻译/编译单元。 【参考方案1】:

首先,翻译和编译单元是一回事。单词/短语翻译单元比编译单元更常用。这基本上意味着您的源文件包括其所有头文件。

第二我们(我指的是优秀的 C++ 书籍)使用术语 function templateclass template 而不是使用术语“模板函数”和“模板类”。

来自documentation

程序的文本保存在本国际标准中称为源文件的单元中。一个源文件 连同通过预处理指令包含的所有头文件(17.6.1.2)和源文件(16.2) #include,减去任何条件包含(16.1)预处理指令跳过的任何源代码行,是 称为翻译单元

还要注意他们在同一文档中使用了术语编译单元。如果您仔细阅读该文档中对编译单元一词的使用,您会发现它们与翻译单元的含义相同。

现在要清除所有内容(从上方),

    编译和翻译单元是一回事。 单独的 cpp 文件(没有其标题)构成翻译单元(或编译单元,因为它们的含义相同)。另一方面,包含所有标头的 cpp 文件确实构成翻译/编译单元。

【讨论】:

在这里非常迂腐:cpp 文件,被标记为编译器/链接器的 TU 相关 cpp 文件,构成 ;) 参见“exotic” UnityBuilds 例如...【参考方案2】:

翻译单元是在 CPP 文件中包含所有标题的结果 - 而不是单独的 CPP 文件。

【讨论】:

以上是关于C++ 编译与翻译单元的主要内容,如果未能解决你的问题,请参考以下文章

什么是 C++ 中的“翻译单元”?

编译原理概述

在一个clang插件中,如何查看编译翻译单元是不是出错?

编译原理概论 01 190904

C ++内联方法实现[重复]

由 C++ 编译器优化时,F2C 翻译的代码中断