1.带参宏中##和#符号的使用
##和#符号只能使用在带参宏中,不能直接使用。#的功能是将#后边的原型都转换成对应的字符串,##的功能是将##前后的原型链接在一起。参考如下例子:
-
#include <stdio.h>
-
-
#define mtos(x) #x
-
#define mtoss(x) mtos(x)
-
#define mtosss(x) mtoss(x)
-
-
#define CONNECT(x,y) x##y
-
#define STR_CONNECT(x,y) mtos(x##y)
-
-
#define G1 K
-
#define G2
-
-
//用带参宏的方式定义枚举
-
enum {
-
CONNECT(O,K) = 0,
-
CONNECT(O,P)
-
};
-
-
int main()
-
{
-
//直接将宏转换成字符串
-
printf("mtos(x):\n");
-
printf("[%s]\n", mtos(G1));
-
printf("[%s]\n", mtos(G2));
-
printf("\n");
-
-
//将宏对应的值转换成字符串
-
printf("mtoss(x):\n");
-
printf("[%s]\n", mtoss(G1));
-
printf("[%s]\n", mtoss(G2));
-
printf("\n");
-
-
//mtoss(x)与mtosss(x)作用相同
-
printf("mtosss(x):\n");
-
printf("[%s]\n", mtosss(G1));
-
printf("[%s]\n", mtosss(G2));
-
printf("\n");
-
-
if (1 == OP) {
-
printf("%s\n", STR_CONNECT(YE,S)); //将宏拼接成字符串
-
}
-
}
编译结果:
-
[root@192 c]# gcc main.c
-
[root@192 c]# ./a.out
-
mtos(x):
-
[G1]
-
[G2]
-
-
mtoss(x):
-
[K]
-
[]
-
-
mtosss(x):
-
[K]
-
[]
-
-
YES
从打印结果中可以看到,mtos(x)将宏G1和G2直接转换成了字符串"G1"和"G2",而
mtoss(x)将宏G1所代表的原型K和G2所代表的原型空转换成了相应的字符串"K"和""。mtoss(x)和mtosss(x)结果相同,因为执行带参宏的第一步,会把为宏的参数直接替换成该宏最终所代表的值。CONECT(O,P)拼接成了一个枚举值OP,其值为1,STR_CONNECT(YE,S)则直接拼接了一个"YES字符串"。其中特别要注意mtos(x)和mtoss(x)的用法。
阅读(1552) | 评论(0) | 转发(0) |