我有两个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\n",STR(_PY_CLASS_NAME(name)));
打印Pyname
。
编辑:你提到的第二个不起作用。如上所述,编译器抱怨缺少有效的预处理令牌。