简单说明C中(仅只能将)宏参字符串化操作, 也建议大家多看英文原著, 参考如下网站:
https://gcc.gnu.org/onlinedocs/gcc-4.9.2/cpp/Stringification.html#Stringification
将宏参(macro argument into a stringconstant)字符串化, 只要在#符号后仅跟传递到宏定义中的参数即可。格式如下:
#define strx(x) #x
**注意宏名后仅跟括号!
其在linux头文件(include/linux/stringify.h)中也有相关使用及说明, 且鼓励大家使用:
#define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(x)
定义为两层的原因是允许第一层的宏扩展(macro expansion),
下面以enum为例说明如何应用, 因为经常需要从enum标量名字上判别含义, 故有需要将枚举值值字符串化打印到log中。
#include <stdlib.h>
#include <stdio.h>
#define strx3(x, y, z) #x" "#y" "#z
#define strx(x) "prefix " #x" "
enum exam {
STR_A,
STR_B,
STR_C,
STR_D,
};
#define enumx_1(x) #x
#define enumx(x) \
x == STR_A ? enumx_1(STR_A) : \
x == STR_B ? enumx_1(STR_B) : \
x == STR_C ? enumx_1(STR_C) : \
x == STR_D ? enumx_1(STR_D) : "null"
int main()
{
enum exam a = STR_B;
printf("test macro: %s\n", enumx(a));
printf("test macro: " strx(GNU) strx3(abc, def, ghi) "\n");
exit(1);
}
保存名为c_macro.c文件
编译:$ gcc -o c_macro c_macro.c
运行:$ ./c_macro
输出:
test macro: STR_B
test macro: prefix GNU abc def ghi
上面宏strx3定义的串插的双引号加空格仅为格式漂亮所加。
如有更漂亮的应用,不吝赐教,感谢。