从令牌和宏的串联创建类似对象的宏
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
的任何宏定义如何),然后将其粘贴到一个标记中以产生结果。
我想从标记和宏的串联中创建一个类对象宏。我有这个代码:
#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
的任何宏定义如何),然后将其粘贴到一个标记中以产生结果。