cpp*_*dev 18 c++ compiler-construction
可能重复:
C++中的"翻译单元"是什么
通常说在C/C++中声明的静态变量在编译单元中是不可见的?这是否意味着每个.c或.cpp文件是一个单独的编译单元?那个.h文件和.h文件中声明的静态变量怎么样?.h文件是否也被视为一个单独的编译单元?
Pét*_*rök 32
头文件没有单独的生命,只有他们的内容是#included.c或.cpp文件.但由于#include由预处理器处理,编译器不知道不同的头文件; 它只将结果代码列表视为输入.这就是所谓的编译单元:一个源文件,其所有#include指令都被相关头文件的内容替换.
vz0*_*vz0 10
C和C++编译(通常)分为三个独立的步骤:
只要存在#include或宏,预处理器就会使用实际值扩展该表达式.在#include整个行被.h文件内容替换的情况下.
实际的编译器(通常)不知道任何头文件,它将编译单元视为一个大的.c或.cpp文件.
"通常"部分来自这样的事实:一些编译器通过在某种缓存中存储预编译头来优化头包含,但效果是相同的.
编译器只处理源文件,通常扩展名为 .c 或 .cpp。编译器并不真正关心包含的文件:就编译器通常实现的而言,每个 .c/.cpp 文件都会重新处理,无论读取的是 .h 文件(由预处理器提供)。
这就是我们谈论“编译单元”的原因:一次性编译的东西,其结果随后可以链接在一起成为可执行文件。