编译时的宏评估

  • 本文关键字:评估 编译 c
  • 更新时间 :
  • 英文 :

#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

在实践中,它甚至没有做到这一点。看看真正的编译器实际是如何处理您的示例的,-O0(优化关闭(的gcc和clang只生成左移位的代码,省略了?:的条件检查和分支,以及第二个永远不为真的操作数。

机器代码最终归结为y = x << 6;,完全没有分支。

最新更新