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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C宏中进行字符串化之前进行标记连接相关的知识,希望对你有一定的参考价值。

我有两个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

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

答案
#define _PY_CLASS_NAME(name) Py##name
#define STR(a) STR_(a)
#define STR_(a) #a

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

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

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

以上是关于在C宏中进行字符串化之前进行标记连接的主要内容,如果未能解决你的问题,请参考以下文章

在宏中连接字符串 - C++

可变宏中令牌的连接

无法在宏中使用 self,因为宏扩展忽略标记“self”

有没有办法删除 C 宏中的引号?

字符串标记化在读取整个字符串之前终止

C++学习(三二七)宏中#和##的作用