按Conditional Macro Expansion
,我的意思是这样的:
XXX(_arg) => AAA(_arg), if _arg > 0
XXX(_arg) => BBB(_arg), otherwise
更具体地说,AAA和BBB不是函数,而是attribute specifiers
- __attribute__ ((attribute-list))
,因此运行时分支不起作用。
有可能写这样的宏吗?如果是这样,怎么样?
答案 0 :(得分:2)
我想你很明显可以写:
#define XXX(arg) ((arg) > 0) ? AAA(arg) : BBB(arg))
这是一种简单的方法。如果arg
是编译时常量,则代码中只能获得两个可能的函数调用之一。如果您想尝试替代方案,请调查Boost Preprocessor包,特别是IF
和IIF
。它适用于C和C ++。
(我将_arg
重命名为arg
以避免与保留给实现的名称发生冲突。我不确定它在这种情况下是否真正重要,但是我要避开名称下划线。)
答案 1 :(得分:0)
在这种情况下,通常的技巧是使用令牌粘贴的方式使您的宏类型为多态"。例如:
#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
这样的事情。
您尝试解决的确切问题是什么?可能有更好的方法。