【发布时间】:2020-08-12 15:38:36
【问题描述】:
我正在学习 C++。我对 C++ 编译过程有所了解,编译过程的第一步是预处理。我很好奇预处理后源文件会发生什么,所以我用 C++ 编写了几行代码。这是我的代码:
#include <iostream>
using std::cout;
using std::endl;
#define PI 3.1416
int main()
{
cout << "Hello World\n";
cout << "The value of PI is: " << PI << '\n';
}
不超过十行代码。
我使用这个编译器标志g++ -E main.cpp > main.p,所以预处理文件是main.p。
预处理后的文件main.p包含28634行代码。
main.p 的前 15 行如下所示:
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "main.cpp"
# 1 "/usr/include/c++/9/iostream" 1 3
# 36 "/usr/include/c++/9/iostream" 3
# 37 "/usr/include/c++/9/iostream" 3
# 1 "/usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h" 1 3
# 252 "/usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h" 3
# 252 "/usr/include/x86_64-linux-gnu/c++/9/bits/c++config.h" 3
最后 10 行 main.p 看起来像:
using std::cout;
using std::endl;
int main()
{
cout << "Hello World\n";
cout << "The value of PI is: " << 3.1416 << '\n';
}
为什么main.p 包含这么多行代码?我的假设(如果我错了请纠正我)是用于构建iostream 库的所有代码都包含在main.p 文件中,如果是这样,那么main.cpp 的二进制或可执行文件不是不必要的大吗?
【问题讨论】:
-
这就是
#include指令的工作原理。它读取文件名并将#include替换为该文件的内容(递归)。iostream是一个巨大的标头,因此包含它对于编译时间和二进制大小来说是一个(很小但仍然)开销。 -
是的,所有包含都递归复制粘贴到每个翻译单元。
-
您的假设是正确的,正如reference 中所述。这与可执行文件的大小无关。
-
编译器非常聪明——尤其是当您打开优化时。它将采用预处理的源文件,并且仅在最终二进制文件中包含实际需要的位。源大小不等于二进制大小。
标签: c++ compilation iostream preprocessor