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 template 或 class template 而不是使用术语“模板函数”和“模板类”。 没有“编译单元”这样的东西。这只是草率的措辞。 @AnoopRana 谢谢你的回复。我也有同样的印象,但我认为您可以同意,该措辞清楚地暗示存在差异,因此我感到困惑。除此之外,它在 isocpp 上的事实确实赋予了该声明一定的权重。您在 C++ 文档中所说的内容是否有来源? @RaresDima 你说“它在 isocpp 上的事实确实给了声明一定的权重”。你能给我们一个链接,isocpp 是这么说的吗? @RaresDima 在您提供的链接中,我只能找到您在上面引用的相同声明。 那里没有说“翻译和编译单元不同”。另请注意,单独的 cpp 文件并不构成翻译/编译单元。另一方面,包含所有头文件的 cpp 文件构成了一个翻译/编译单元。 【参考方案1】:首先,翻译和编译单元是一回事。单词/短语翻译单元比编译单元更常用。这基本上意味着您的源文件包括其所有头文件。
第二我们(我指的是优秀的 C++ 书籍)使用术语 function template
或 class template
而不是使用术语“模板函数”和“模板类”。
来自documentation
程序的文本保存在本国际标准中称为源文件的单元中。一个源文件 连同通过预处理指令包含的所有头文件(17.6.1.2)和源文件(16.2) #include,减去任何条件包含(16.1)预处理指令跳过的任何源代码行,是 称为翻译单元
还要注意他们在同一文档中使用了术语编译单元。如果您仔细阅读该文档中对编译单元一词的使用,您会发现它们与翻译单元的含义相同。
现在要清除所有内容(从上方),
-
编译和翻译单元是一回事。
单独的 cpp 文件(没有其标题)不构成翻译单元(或编译单元,因为它们的含义相同)。另一方面,包含所有标头的 cpp 文件确实构成翻译/编译单元。
【讨论】:
在这里非常迂腐:cpp 文件,被标记为编译器/链接器的 TU 相关 cpp 文件,构成 ;) 参见“exotic” UnityBuilds 例如...【参考方案2】:翻译单元是在 CPP 文件中包含所有标题的结果 - 而不是单独的 CPP 文件。
【讨论】:
以上是关于C++ 编译与翻译单元的主要内容,如果未能解决你的问题,请参考以下文章