Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313475
  • 博文数量: 82
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-13 10:58
文章分类

全部博文(82)

文章存档

2018年(2)

2017年(9)

2016年(71)

我的朋友

分类: C/C++

2017-02-08 20:45:20

1.带参宏中##和#符号的使用

  ##和#符号只能使用在带参宏中,不能直接使用。#的功能是将#后边的原型都转换成对应的字符串,##的功能是将##前后的原型链接在一起。参考如下例子:

  1. #include <stdio.h>

  2. #define mtos(x) #x
  3. #define mtoss(x) mtos(x)
  4. #define mtosss(x) mtoss(x)

  5. #define CONNECT(x,y) x##y
  6. #define STR_CONNECT(x,y) mtos(x##y)

  7. #define G1 K
  8. #define G2

  9. //用带参宏的方式定义枚举
  10. enum {
  11.     CONNECT(O,K) = 0,
  12.     CONNECT(O,P)
  13. };

  14. int main()
  15. {
  16.     //直接将宏转换成字符串
  17.     printf("mtos(x):\n");
  18.     printf("[%s]\n", mtos(G1));
  19.     printf("[%s]\n", mtos(G2));
  20.     printf("\n");

  21.     //将宏对应的值转换成字符串
  22.     printf("mtoss(x):\n");
  23.     printf("[%s]\n", mtoss(G1));
  24.     printf("[%s]\n", mtoss(G2));
  25.     printf("\n");

  26.     //mtoss(x)与mtosss(x)作用相同
  27.     printf("mtosss(x):\n");
  28.     printf("[%s]\n", mtosss(G1));
  29.     printf("[%s]\n", mtosss(G2));
  30.     printf("\n");

  31.     if (1 == OP) {
  32.         printf("%s\n", STR_CONNECT(YE,S));    //将宏拼接成字符串
  33.     }    
  34. }
编译结果:
  1. [root@192 c]# gcc main.c
  2. [root@192 c]# ./a.out
  3. mtos(x):
  4. [G1]
  5. [G2]

  6. mtoss(x):
  7. [K]
  8. []

  9. mtosss(x):
  10. [K]
  11. []

  12. 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) |
给主人留下些什么吧!~~