预处理器常量折叠
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 标记的解析器内部有自己的常量折叠。
我有一个关于 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 标记的解析器内部有自己的常量折叠。