C++编译与翻译单元
C++ compilation vs translation unit
我正在准备一个关于工作模板的简短演示,并将isocpp.org作为内容的起点。然而,我遇到了一个有趣的段落:
专家注意:我显然在上面做了几个简化。这是故意的,所以请不要大声抱怨。如果你知道.cpp文件和编译单元之间的区别,类模板和模板类之间的区别以及模板实际上不仅仅是美化的宏这一事实,那么不要抱怨:这个特定的问题/答案一开始就不是针对你的。我简化了一些事情,这样新手就会"明白",即使这样做冒犯了一些专家。
有几件事让我感到困惑,其中之一是.cpp文件与编译单元。
我已经读到一个单独的.cpp文件被称为";翻译单元";。但究竟什么是汇编单位呢?
我发现这个答案说翻译和编译单位是一样的,基本上只是一个.cpp文件的花哨名称,但isocpp似乎不这么认为,即使我搜索",谷歌也只会对翻译单位做出解释;编译单元";。维基百科似乎提到了";单一编译单元";模型,但没有深入了解什么是实际的编译单元。
那么,什么是编译单元,它与翻译单元有何不同(翻译单元与.cpp文件是否100%相同(?
首先,翻译和编译单元是一回事。单词/短语翻译单位的使用频率高于汇编单位。这基本上意味着你的源文件包括它的所有头文件。
其次我们(我指的是好的C++书(使用术语CCD_ 1或CCD_;模板函数";以及";模板类";。
来自文件
程序的文本以本国际标准中称为源文件的单位保存。源文件以及通过预处理指令包含的所有头文件(17.6.1.2(和源文件(16.2(#include减去任何条件包含(16.1(预处理指令跳过的任何源行,即称为翻译单元
请注意,在同一文档中,他们使用了术语"编译单位"。如果你仔细阅读该文件中"编译单位"一词的用法,你会发现它们的含义与翻译单位相同。
现在要清除一切(从上面(,
- 编译单元和翻译单元是一回事
- 单独的cpp文件(没有其头(并不构成翻译单元(或编译单元,因为它们的意思相同(。另一方面,包含所有标头的cpp文件确实构成了翻译/编译单元
翻译单元是在CPP文件中包含所有标头的结果,而不仅仅是CPP文件。
- 不同翻译单元中不可重载的非内联函数定义
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 如何执行 cppcheck 交叉翻译单元 (CTU) 静态分析?
- 模板变量是否允许在多个翻译单元中并有效合并?
- 是否允许类在程序中的不同翻译单元之间具有不同的定义?
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 为什么不同的翻译单元没有独立和沙盒的内存空间?
- 为什么编译器不在同一翻译单元中警告 ODR 违规
- 静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?
- 来自不同翻译单元的函数会干扰吗?
- 如何在C++中的不同翻译单元之间共享枚举的实例
- 在C++中声明"interface",而不是将其 vtable 发送到每个翻译单元
- MSVC 2017 在单个翻译单元中违反静态初始化顺序
- 在不同的翻译单元中启动全局变量(涉及链接)
- 链接器如何处理跨翻译单元的相同模板实例化
- 在不同翻译单元中具有静态存储持续时间的依赖非局部常量浮点变量的常量初始化
- 翻译单元的数量与CPP文件的数量
- GCC 6.3.0 中的 ODR 冲突,类型在两个单独的翻译单元中定义
- 为什么结构和类定义可以在多个翻译单元上重复?
- 如果在同一翻译单元中调用功能,为什么需要搬迁