gpt4 book ai didi

c++ - 为什么简单的C++源文件的预处理文件包含数千行代码?

转载 作者:行者123 更新时间:2023-12-02 09:48:04 29 4
gpt4 key购买 nike

我正在学习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 header 的全部内容都包含在预处理器输出中。这是传递发生的:iostream包含的每个 header 也都包含在内,依此类推。这本质上就是#include的意思!
但是,这并不意味着您的可执行文件会很大:

  • header 通常仅包含声明,而不包含实现。声明不包含任何可执行代码。实际的实现在共享库中。
  • 标准库中的许多 header 仅包含模板,这些模板在实例化之前不会发出任何代码。
  • 头中允许
  • 内联实现,但是在调用站点中可以内联它们,因此,只要您不调用它们,它们也不会被编译。
  • 关于c++ - 为什么简单的C++源文件的预处理文件包含数千行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63380020/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com