我说的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预处理器包,特别是IF
和IIF
。它可以在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
。
你想解决的问题到底是什么?也许有更好的方法