Clang是否支持条件宏展开?



我说的Conditional Macro Expansion是这样的:

XXX(_arg) => AAA(_arg), if _arg > 0
XXX(_arg) => BBB(_arg), otherwise

更具体地说,AAA和BBB不是函数,而是attribute specifiers - __attribute__ ((attribute-list)),因此运行时分支不起作用。

是否可以这样写宏?如果有,怎么做?

我想很明显你可以这样写:

#define XXX(arg) ((arg) > 0) ? AAA(arg) : BBB(arg))

这是最简单的方法。如果arg是编译时常数,那么您将只得到代码中两个可能的函数调用中的一个。如果您想尝试另一种方法,请研究Boost预处理器包,特别是IFIIF。它可以在C和c++中工作。

(我将_arg重命名为arg以避免与为实现保留的名称冲突。我不确定它在这种情况下是否真的重要,但我会避免使用以下划线开头的名称。

在这种情况下,通常的技巧是以某种方式使用令牌粘贴,使您的宏具有"多态"。例如:

#define IFtrue(a,b) a
#define IFfalse(a,b) b
#define IF(x,a,b) IF##x(a,b)
IF(true, int, double) IF(false, foo(), main()) { }

不幸的是,只有当你的"条件"字面上是单词true或单词false时,这才有效;它不工作的东西,如a > 0

你想解决的问题到底是什么?也许有更好的方法

最新更新