,Conditional Macro Expansion
我的意思是这样的:
XXX(_arg) => AAA(_arg), if _arg > 0
XXX(_arg) => BBB(_arg), otherwise
更具体地说,AAA 和 BBB 不是函数,而是attribute specifiers
—<code>__attribute__ ((attribute-list)),因此运行时分支不起作用。
可以这样写宏吗?如果是这样,怎么做?
我想很明显你可以写:
#define XXX(arg) ((arg) > 0) ? AAA(arg) : BBB(arg))
这是简单的方法。如果arg
是一个编译时常量,您将只获得代码中两个可能的函数调用之一。如果您想尝试替代方案,请研究Boost Preprocessor包,尤其是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()) { }
不幸的是,这仅在您的“条件”是字面意思是 wordtrue
或 word时才有效false
;它不适用于类似的事情a > 0
.
您要解决的确切问题是什么?可能有更好的方法。