有没有办法在编译时而不是在运行时执行此条件?
"标志"将永远是一个常数。 A()和B()是宏。
#define DEMO(flag, p) if (flag) A(p); else B(p)
为什么我要这样做?因为宏A可能存在也可能不存在,具体取决于底层硬件(宏A控制微控制器上的硬件)。
如果使用" flag"来调用DEMO 评估为 false,它并不重要 - 它应该编译。但是,如果DEMO被调用" flag" 评估为为true,我希望看到构建错误。
增加:
预期用途是这样的:
DEMO(true, p); // this should cause a build error
DEMO(false, p); // this should compile OK
DEMO(0, p); // should be OK
DEMO(1 == 2, p); // should be OK
DEMO(1 == 1, p); // should cause a build error
传递的参数始终是常量,但并不总是相同的常量。
答案 0 :(得分:7)
有没有办法在编译时而不是在运行时执行此条件?
不确定
// add or remove this definition
#define flag
#if defined(flag)
#define DEMO(p) A(p)
#else
#define DEMO(p) B(p)
#endif
ADDED响应OP的补充:
#define DEMOfalse(p) B(p)
#define DEMOtrue(p) A(p)
#define DEMO(flag,p) DEMO##flag(p)
这使用" stringizing"运算符(##
)将##flag
替换为您调用宏的实际源代码文本。
DEMO(true,p)
将扩展为DEMOtrue(p)
,扩展为A(p)
。如果您通过true
并且未定义A
,则您的构建将失败。
DEMO(false,p)
将扩展为DEMOfalse(p)
,然后B(p)
,这将构建是否定义了A
。
编辑以回应OP的编辑:
一个宏不能包含预处理器语句(好吧,可以,但它们不会被预处理器处理过),所以没有办法把编译时间条件设置为< em> in 宏,因此上面显示的方法。