0

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

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

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

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

4

2 回答 2

2

我想很明显你可以写:

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

这是简单的方法。如果arg是一个编译时常量,您将只获得代码中两个可能的函数调用之一。如果您想尝试替代方案,请研究Boost Preprocessor包,尤其是IFIIF. 它适用于 C 和 C++。

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

于 2013-06-19T04:41:58.273 回答
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()) { }

不幸的是,这仅在您的“条件”是字面意思是 wordtrue或 word时才有效false;它不适用于类似的事情a > 0.

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

于 2014-04-12T01:42:58.897 回答