C++中的编译单元是如何定义的?[副本]

dgjrabp2  于 2023-05-20  发布在  其他
关注(0)|答案(3)|浏览(177)

此问题已在此处有答案

12年前就关门了。

可能重复:

What is a “translation unit” in C++
人们常说C/C++中声明的静态变量在编译单元中是不可见的。这是否意味着每个.c或.cpp文件都是一个单独的编译单元?h文件和.h文件中声明的静态变量怎么办?.h文件是否也被视为单独的编译单元?

py49o6xq

py49o6xq1#

头文件没有单独的生命,只有它们的内容是#included到.c或.cpp文件。但是由于#include是由预处理器处理的,所以编译器不知道不同的头文件;它只看到作为输入的结果代码列表。这就是所谓的 * 编译单元 *:一个源文件,其所有的#include指令被相关头文件的内容和所有其他预处理器语句(如#define#ifdef等)所取代。

e5njpo68

e5njpo682#

C和C++编译(通常)分为三个独立的步骤:

  • 预处理,涉及宏和#include扩展。
  • 编译、将源代码转换为二进制代码并生成中间目标文件。
  • 链接,将对象文件合并到单个ELF或EXE文件中。

只要有#include或宏,预处理器就用实际值扩展该表达式。在#include的情况下,整行都被替换为.h文件内容。
实际的编译器(通常)不知道任何头文件,它将编译单元视为大的.c或.cpp文件。
“通常”部分来自这样一个事实,即一些编译器通过将预编译的头存储在某种缓存中来优化头包含,但效果是相同的。

rfbsl7qr

rfbsl7qr3#

编译器只处理源文件,通常扩展名为.c或. cpp。编译器并不真正关心包含的文件:只要编译器通常被实现,无论读取什么.h文件,每个.c/.cpp文件都被重新处理(由预处理器提供)。
这就是为什么我们谈论“编译单元”:一次编译的东西,其结果随后可以链接在一起成为可执行文件。

相关问题