我想从令牌和宏的串联中创建一个类似对象的宏。我有这段代码:
#define alfa vita
/* Code below is broken. */
#define gamma delta##alfa
gamma
gamma
替换为deltaalfa
。我想用deltavita
替换它。我怎么能这样做?
我不希望gamma是一个类似函数的宏。
What are the applications of the ## preprocessor operator and gotchas to consider?
这个问题非常广泛。它没有关注我的问题,第一个答案也没有解决它。
答案 0 :(得分:6)
您必须执行双宏扩展,如下所示:
#define alfa vita
#define concat2(a,b) a ## b
#define concat(a,b) concat2(a,b)
#define gamma concat(delta, alfa)
gamma
首先不扩展字符串化(#
)和令牌粘贴(##
)运算符的操作数。作为一种特殊情况,函数式宏的扩展首先扩展参数,除非它们是#
或##
运算符的操作数,然后将它们替换为宏体,然后重新扫描替换。
上面的双扩展方法有效,因为concat()
宏的参数不是##
(或#
)的操作数。因此,它们在被替换为宏观体之前被扩展以产生
concat2(delta, vita)
重新扫描后,进一步扩展到
delta ## vita
(无论符号vita
的任何宏定义),然后将其粘贴到一个令牌中以产生结果。