Macros Clang支持条件宏扩展吗?

Macros Clang支持条件宏扩展吗?,macros,clang,Macros,Clang,通过条件宏扩展,我的意思是: XXX(_arg) => AAA(_arg), if _arg > 0 XXX(_arg) => BBB(_arg), otherwise 更具体地说,AAA和BBB不是函数,而是属性说明符-\uuuu属性((属性列表)),因此运行时分支不起作用 可以这样编写宏吗?如果是这样,怎么写?我想很明显你可以写: #define XXX(arg) ((arg) > 0) ? AAA(arg) : BBB(arg)) 这是一个简单的方法。如果arg

通过
条件宏扩展
,我的意思是:

XXX(_arg) => AAA(_arg), if _arg > 0
XXX(_arg) => BBB(_arg), otherwise
更具体地说,AAA和BBB不是函数,而是
属性说明符
-
\uuuu属性((属性列表))
,因此运行时分支不起作用


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

我想很明显你可以写:

#define XXX(arg) ((arg) > 0) ? AAA(arg) : BBB(arg))
这是一个简单的方法。如果
arg
是编译时常量,则代码中两个可能的函数调用中只能得到一个。如果您想尝试另一种选择,请调查软件包,尤其是和。它与C以及C++一起工作。
(我将
\u 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


你到底想解决什么问题?可能有更好的方法。

\u arg
可以,我想。只有两个下划线或一个下划线和一个大写字母在危险区,IIRC。我想这可能不是问题,我也这么说了,但我对这些事情相当谨慎(过去经常被咬)。该标准(ISO/IEC 9899:2011§7.1.3保留标识符)规定:所有以下划线和大写字母或其他下划线开头的标识符始终保留供任何用途。-所有以下划线开头的标识符始终保留为在普通和标记名称空间中用作具有文件范围的标识符。再说一次,这一次可能没问题,但当坏习惯刚形成时,改掉它们就容易多了。我刚刚更新了问题,使之更具体。在我的情况下,运行时分支不起作用。