从标记和宏的串联创建类似对象的宏

时间:2015-04-23 19:54:26

标签: c concatenation c-preprocessor

我想从令牌和宏的串联中创建一个类似对象的宏。我有这段代码:

#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?
这个问题非常广泛。它没有关注我的问题,第一个答案也没有解决它。

1 个答案:

答案 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的任何宏定义),然后将其粘贴到一个令牌中以产生结果。