【问题标题】:When c macros are expanded why does the code get so big?扩展 c 宏时,为什么代码会变得如此之大?
【发布时间】:2020-04-25 17:06:38
【问题描述】:

我一直在试验 C 的宏,并决定扩展它们以查看替换。当我为 gcc 提供 -E 时,我得到了 800 行代码,仅用于这个简单的代码:

#include <stdio.h>
#define TEN 10

int main(void) {
    printf("hello world %d", TEN);
    return 0;
}

我的问题:

  • 为什么会有这么多行!?
  • 这么多行,C 怎么能跑得这么快?
  • 这么多行有问题吗?

【问题讨论】:

  • stdio.h 有多少行?
  • 你明白gcc是一个编译器,所以源代码行数与可执行文件的性能没有密切关系?
  • 不要害怕,它们不会成为生成代码的一部分,这会增加编译时间/内存,但与您的可执行文件无关
  • 哦,好的。吓到我突然变大了。
  • @Xilpex 这 800 行什么都不是,当您将“经典”文件包含为 vector,string,iostream ... 时,在 c++ 中更多的是,相当于 stdio 在 c++ 中是 iostream,而在仅包含 #include &lt;iostream&gt; 的文件上的 g++ -E 会产生超过 28000 行 ;-)

标签: c gcc macros line-numbers


【解决方案1】:

-E 选项要求 gcc 在预处理器阶段之后停止而不进行编译,因此您最终得到的是(本质上)将系统的整个 stdio.h 文件复制并粘贴到程序的头文件中。这绝对是 800 行的来源。

不过,这不是问题,因为当您编译约 800 行程序时,stdio.h 中您未在代码中使用的函数原型不会占用可执行文件中的空间。

至于“这么多行的 C 怎么跑得这么快”,重要的是要记住,我们编写的源代码不是机器执行的,机器执行的是编译器从源代码生成的编译后的二进制文件。

如果您删除 #define TEN 10 并将 printf 行更改为 printf("hello world %d",10); 并再次运行 gcc-E,您会发现与以前几乎完全相同的 ~800 行源文件。这不是#define 的症状,这只是 C 预处理器的工作原理,无需担心 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 2018-09-29
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多