条件里面的C宏?

ner*_*com 3 c-preprocessor

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

"flag"永远是一个常数.A()和B()是宏.

#define DEMO(flag, p) if (flag) A(p); else B(p)
Run Code Online (Sandbox Code Playgroud)

我为什么要这样做?因为宏A可能存在也可能不存在,具体取决于底层硬件(宏A控制微控制器上的硬件).

如果使用"flag"调用DEMO并将其计算为 false,则无关紧要 - 它应该编译.但是如果使用"flag"调用DEMO并将其计算为 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
Run Code Online (Sandbox Code Playgroud)

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

Mud*_*Mud 7

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

当然:

// add or remove this definition
#define flag

#if defined(flag)
   #define DEMO(p) A(p)
#else
   #define DEMO(p) B(p)
#endif
Run Code Online (Sandbox Code Playgroud)

添加以响应OP的补充:

#define DEMOfalse(p) B(p)
#define DEMOtrue(p) A(p)
#define DEMO(flag,p) DEMO##flag(p)
Run Code Online (Sandbox Code Playgroud)

这使用"stringizing"运算符(##)替换##flag为您调用宏的实际源代码文本.

DEMO(true,p)将扩展到DEMOtrue(p),扩展到A(p).如果您通过true并且A未定义,则构建将失败.

DEMO(false,p)DEMOfalse(p)然后B(p),将扩展到将构建是否A定义.


编辑以响应OP的编辑:

宏不能包含预处理器语句(好吧,它可以,但它们不会被预处理器处理),所以没有办法宏中放置编译时条件,因此上面显示的方法.