gpt4 book ai didi

c-preprocessor - C宏中有条件?

转载 作者:行者123 更新时间:2023-12-03 18:32:43 28 4
gpt4 key购买 nike

有没有办法在编译时而不是在运行时有条件地做到这一点?

“标志”将永远是一个常数。 A() 和 B() 是宏。

#define DEMO(flag, p) if (flag) A(p); else B(p)

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

如果 DEMO 使用计算结果为 false 的“标志”调用,则无关紧要 - 它应该编译。但是,如果使用评估为 true 的“标志”调用 DEMO,我希望看到构建错误。

添加:

预期用途是这样的:
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

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

最佳答案

Is there any way to do this conditional at compile time instead of at runtime?



当然:
// add or remove this definition
#define flag

#if defined(flag)
#define DEMO(p) A(p)
#else
#define DEMO(p) B(p)
#endif

添加响应 OP 的添加:
#define DEMOfalse(p) B(p)
#define DEMOtrue(p) A(p)
#define DEMO(flag,p) DEMO##flag(p)

这使用替换 ## 的“字符串化”运算符( ##flag )使用您调用宏的实际源代码文本。
DEMO(true,p)将扩展为 DEMOtrue(p) ,扩展为 A(p) .如果您通过 trueA未定义,您的构建将失败。
DEMO(false,p)将扩展为 DEMOfalse(p) ,然后 B(p) , 无论是否会生成 A被定义为。

编辑以响应 OP 的编辑:

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

关于c-preprocessor - C宏中有条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32020854/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com