有条件的内部C宏?

时间:2015-08-15 02:16:59

标签: c-preprocessor

有没有办法在编译时而不是在运行时执行此条件?

"标志"将永远是一个常数。 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

传递的参数始终是常量,但并不总是相同的常量。

1 个答案:

答案 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 宏,因此上面显示的方法。