如何将__COUNTER__字符串化并以字符串形式打印?
如何把__COUNTER__预定义宏转成字符串打印
嘿,这个问题我之前也踩过坑!直接写printf("%s\n", #__COUNTER__)确实行不通,而且你遇到的乱码报错大概率是输入时不小心带了特殊字符(比如全角符号或者不可见编码),但就算编码没问题,这种写法也达不到你要的效果——它只会输出字符串"__COUNTER__",根本不会展开那个自动递增的计数器值。
正确的实现方法
要实现先展开__COUNTER__再把它转成字符串,得靠两层中转宏来搞定,代码示例如下:
#include <stdio.h> // 第一层:负责把传入的内容字符串化 #define STRINGIFY(x) #x // 第二层:先让预处理器展开宏参数,再传给STRINGIFY处理 #define EXPAND_THEN_STRINGIFY(x) STRINGIFY(x) int main() { // 第一次调用,输出当前COUNTER值的字符串形式 printf("%s\n", EXPAND_THEN_STRINGIFY(__COUNTER__)); // 第二次调用,COUNTER自动递增,输出下一个值的字符串 printf("%s\n", EXPAND_THEN_STRINGIFY(__COUNTER__)); return 0; }
原理说明
预处理器的#字符串化运算符有个特点:它不会自动展开紧跟的宏参数,只会把标识符原样转成字符串。所以我们需要第二层宏EXPAND_THEN_STRINGIFY,先让它把__COUNTER__展开成具体的整数值,再把这个数值传给STRINGIFY转成字符串,这样就能得到你想要的结果了。
另外要注意,__COUNTER__是GCC、Clang、MSVC等主流编译器支持的非标准预定义宏,每次被引用时会自动加1,如果你用的是非常小众的编译器,可能需要先确认它是否支持这个宏。
内容的提问来源于stack exchange,提问作者Har
相关产品推荐
相关产品推荐

