从令牌和宏的串联创建类似对象的宏

Create object-like macro from concatenation of token and macro

我想从标记和宏的串联中创建一个类对象宏。我有这个代码:

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

您必须像这样执行双重宏展开:

#define alfa vita

#define concat2(a,b) a ## b
#define concat(a,b) concat2(a,b)
#define gamma concat(delta, alfa)

gamma

字符串化 (#) 和标记粘贴 (##) 运算符的操作数未首先展开。作为一种特殊情况,函数式宏的扩展首先扩展参数 除了它们是 ### 运算符 的操作数,然后代入它们进入宏体,然后重新扫描替换。

上面的双扩展方法之所以有效,是因为 concat() 宏的参数不是 ##(或 #)的操作数。因此,它们在被替换到该宏的主体中以产生 yield

之前被扩展
concat2(delta, vita)

重新扫描后,进一步扩展为

delta ## vita

(不管符号 vita 的任何宏定义如何),然后将其粘贴到一个标记中以产生结果。