Clang是否支持有条件的宏扩展?

时间:2013-06-19 04:33:43

标签: macros clang

Conditional Macro Expansion,我的意思是这样的:

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

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

有可能写这样的宏吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:2)

我想你很明显可以写:

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

这是一种简单的方法。如果arg是编译时常量,则代码中只能获得两个可能的函数调用之一。如果您想尝试替代方案,请调查Boost Preprocessor包,特别是IFIIF。它适用于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这样的事情。

您尝试解决的确切问题是什么?可能有更好的方法。