编译时进行宏评估?

问题描述

#define CONVERT(val,qin,qout) ((qin > qout) ? (val >> (qin-qout) ) : (val << (qout-qin)))

void f(void)
{
    ...
    y = CONVERT(x,25,31);
}

GCC会在编译时评估上述宏吗?我的意思是(qin > qout)部分。编译完成后,我尝试仅使用y = x << (31-25)

解决方法

在这种情况下,qin > qout部分最终将成为整数常量,编译器可以在理论上将其优化为10。 / p>

实际上,它甚至没有这样做。看一下真正的编译器如何实际对待您的示例,-O0处的gcc和clang(优化关闭)仅生成左移代码,省略了条件检查和分支?:,以及第二个代码操作数永远是不正确的。

机器代码最终沸腾到y = x << 6;的水平,完全没有分支。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...