在C宏中进行字符串化之前进行标记连接

问题描述 投票:0回答:1

我有两个C宏,第一个基本上连接两个令牌

#define _PY_CLASS_NAME(name) Py##name

第二个宏是字符串化输入参数

#define STR(text) #text

因为当我尝试类似的东西时,C预处理器的工作方式

STR(_PY_CLASS_NAME(name))

我实际上得到了“_PY_CLASS_NAME(姓名)”。所以问题是,如何避免它?

我试过类似的东西

#define CONCAT(A, B) #A###B

它的工作原理。但也许这是一个更好的方法呢?

c macros
1个回答
1
投票
#define _PY_CLASS_NAME(name) Py##name
#define STR(a) STR_(a)
#define STR_(a) #a

这以不同的方式解决了问题,并且还阐明了宏如何工作。原因是 - 当宏参数在宏体中被替换时,它们会被扩展,直到它们与该宏中的###预处理器运算符一起出现。

现在这样做printf("%s\n",STR(_PY_CLASS_NAME(name)));打印Pyname

编辑:你提到的第二个不起作用。如上所述,编译器抱怨缺少有效的预处理令牌。

© www.soinside.com 2019 - 2024. All rights reserved.