C宏参字符串化操作

简单说明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定义的串插的双引号加空格仅为格式漂亮所加。

如有更漂亮的应用,不吝赐教,感谢。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值