预处理器常量折叠

Preprocessor constant folding

我有一个关于 C 预处理器常量评估的基本问题,我希望获得一些帮助,以了解预处理器是否有助于在这种情况下优化代码。我知道预处理器只是 "replaces text" 在代码中。根据该规则,即使是常量表达式也会在代码中被替换。例如下面的代码:

#include <stdio.h>

#define MY_NUM 2+2*2

int main()
{
    int a = 6/MY_NUM;
    printf("a: %d\n", a);
    return 0;
}

a 的值为 7。这是因为预处理后的代码如下所示:

int main()
{
    int a = 6/2+2*2;
    printf("a: %d\n", a);
    return 0;
}

我可以看到 MY_NUM 在编译开始之前没有评估为 6。当然,编译器然后通过在编译时评估 a 的值来优化代码。

我不确定是否会发生预处理器常量折叠,或者是否有可能。或者有什么方法(gcc 中的标志)来启用它。常规 -O 优化不会启用此功能。无论如何我们可以在这里改变预处理器的行为吗?

我的代码使用的是 gcc 4.8.4。

不,预处理器计算任何表达式的唯一时间是在 #if / #elif.

你可以通过标记连接和大量宏来实现它来伪造算术,但这比简单地做要难得多

#define MY_NUM (2+2*2)

但是没有简单的编译器开关,因为宏扩展只是标记替换。

预处理器有自己的常数值计算器,它使用这个计算器来获取所有条件运算符中表达式的值#if #elif.

即使可以从预处理器标记的替换列表中折叠常量,它也永远不会这样做,因为它不知道它是否预处理了 C 代码或其他代码text/language。

C预处理器具有通用性,它不仅仅针对C语言预处理。

C 编译器可能在解析 C 标记的解析器内部有自己的常量折叠。