为什么简单的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行代码。

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

main.p的最后10行如下:

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的意思!

但是,这并不意味着您的可执行文件会很大:

  • 标题通常仅包含声明,而不包含实现。声明不包含任何可执行代码。实际的实现在共享库中。
  • 标准库中的许多标头仅包含模板,这些模板在实例化之前不会发出任何代码。
  • 标头中允许使用
  • 内联实现 ,但是在调用站点中可以内联它们,因此只要您不调用它们,它们也不会被编译。
,

#include指令从字面上将所包含文件的内容粘贴到最终文件中以进行编译。对于C ++,单个include可以拖移包含文件中的许多其他include,从而对生成的文件进行缓冲。

这只是C ++包含工作的方式。可执行文件的大小将包含支持您的功能所需的代码,并且无法解决。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...