c++ - 为什么简单 C++ 源文件的预处理文件包含数千行代码?
问题描述
我正在学习 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 行代码。
前 15 行main.p
如下所示:
# 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
不必要的大吗?
解决方案
您的假设是正确的:iostream
标头的全部内容都包含在预处理器输出中。这会传递地发生:包含的每个标头iostream
也包含在内,依此类推。这基本上是什么#include
意思!
但是,这并不意味着您的可执行文件会很大:
- 标头通常只包含声明,而不包含实现。声明不包含任何可执行代码。实际实现在共享库中。
- 标准库中的许多标头仅包含模板,在实例化之前不会发出任何代码。
- 标头中允许内联实现,但它们在调用站点中内联,因此只要您不调用它们,它们也不会被编译。
推荐阅读
- python - 使用 JSON 对象中的标头和数据构建 CSV
- c# - 如何在 selenium web 驱动程序和 c# 中使用 sendkeys,以便生成唯一的名称和帐号
- java - java.lang.StringIndexOutOfBoundsException:开始 0,结束 4,长度 1
- python - CNN:转发一批图像 - 使用多个内核时卡住
- go - 将您的 App Engine 应用从 Go 1.9 迁移到 Go 1.11
- modelica - 无法使 Modelica 标准库中的泵正常工作
- laravel - laravel-5.7 中的数据没有被删除
- python - Django TypeError:键必须是 str、int、float、bool 或 None,而不是 News_Channel
- selenium - 如何在不被阻止的情况下抓取网站?
- reactjs - 为什么当我尝试运行我的应用程序时 docker run 什么都不做?