如何在c ++中定义编译单元?

cpp*_*dev 18 c++ compiler-construction

可能重复:
C++中的"翻译单元"是什么

通常说在C/C++中声明的静态变量在编译单元中是不可见的?这是否意味着每个.c或.cpp文件是一个单独的编译单元?那个.h文件和.h文件中声明的静态变量怎么样?.h文件是否也被视为一个单独的编译单元?

Pét*_*rök 32

头文件没有单独的生命,只有他们的内容是#included.c或.cpp文件.但由于#include由预处理器处理,编译器不知道不同的头文件; 它只将结果代码列表视为输入.这就是所谓的编译单元:一个源文件,其所有#include指令都被相关头文件的内容替换.

  • ...减去条件预处理器指令排除的任何行。 (2认同)

vz0*_*vz0 10

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

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

只要存在#include或宏,预处理器就会使用实际值扩展该表达式.在#include整个行被.h文件内容替换的情况下.

实际的编译器(通常)不知道任何头文件,它将编译单元视为一个大的.c或.cpp文件.

"通常"部分来自这样的事实:一些编译器通过在某种缓存中存储预编译头来优化头包含,但效果是相同的.


Pon*_*gge 5

编译器只处理源文件,通常扩展名为 .c 或 .cpp。编译器并不真正关心包含的文件:就编译器通常实现的而言,每个 .c/.cpp 文件都会重新处理,无论读取的是 .h 文件(由预处理器提供)。

这就是我们谈论“编译单元”的原因:一次性编译的东西,其结果随后可以链接在一起成为可执行文件。