如何在C++预处理器中正确展开布尔表达式并固化结果?
C++预处理器宏求值问题解决方案
问题背景
现有如下C++预处理器代码,无法正确展开布尔表达式:
#define EXPAND(x) x #define SWITCH false EXPAND(SWITCH || defined(_DEBUG))
需求:定义FLAG宏,使其等价于上述EXPAND(SWITCH || defined(_DEBUG))的展开结果,且后续修改SWITCH的值不会影响FLAG的最终取值。
实现方案
要让FLAG在定义时就完成所有宏展开和布尔表达式求值,需要通过两层宏展开强制预处理器在定义阶段完成计算,代码如下:
#define EVAL(expr) expr #define EXPAND_AND_EVAL(expr) EVAL(expr) #define SWITCH false #define FLAG EXPAND_AND_EVAL(SWITCH || defined(_DEBUG))
原理说明
- 预处理器处理
EXPAND_AND_EVAL(SWITCH || defined(_DEBUG))时,会先完全展开参数中的SWITCH和defined(_DEBUG),得到具体的布尔表达式(比如false || 0或false || 1)。 - 随后将展开后的表达式传入
EVAL,预处理器会直接计算该布尔表达式的结果,最终FLAG会被替换为0或1。后续修改SWITCH的定义,不会再改变FLAG的取值。
效果验证
- 若未定义
_DEBUG,FLAG会被预处理器替换为0; - 若定义了
_DEBUG,FLAG会被替换为1; - 之后即使修改
#define SWITCH true,FLAG的取值也不会发生变化。
内容的提问来源于stack exchange,提问作者bers
相关产品推荐
相关产品推荐

