在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宏中进行字符串化之前进行标记连接的主要内容,如果未能解决你的问题,请参考以下文章