Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86663
  • 博文数量: 18
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 118
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-25 16:28
个人简介

***

文章分类

全部博文(18)

文章存档

2017年(18)

我的朋友

分类: C/C++

2017-04-04 20:42:30

代码如下:

点击(此处)折叠或打开

  1. #define ConvertMem2Var1(ret,mem) ({ \
  2.     if(1 != sizeof(mem))return 0; \
  3.     typeof(&ret) _p = (mem); *_p;})

  4. #define ConvertMem2Var2(ret,pt) ({ \
  5.     ASSERT(sizeof(*pt) == 1); \
  6.     typeof(&ret) _p = (pt); \
  7.     switch(sizeof(*_p)/sizeof(pt[0])) \
  8.     { \
  9.     case 1: pt++;break; \
  10.     case 2: pt+=2;break; \
  11.     } \
  12.     *_p; \
  13.     })

  14. #define ConvertMem2Var3(ret,pt) ({ \
  15.     ASSERT(sizeof(*pt) == 1); \
  16.     typeof(&ret) _p = (pt); \
  17.     pt += sizeof(*_p)/sizeof(pt[0]); \
  18.     *_p; \
  19.     })


  20. int test()
  21. {
  22.   short int i;
  23.   long int l;
  24.   char *pm, mem[4] = {.....}, mem2[100];
  25.   pm = mem2;
  26.   i = ConvertMem2Var1(i, mem);
  27.   i = ConvertMem2Var2(i, pm); //执行后pm会自动按sizeof(i)递增
  28.   l = ConvertMem2Var2(l, pm);
  29.   l = ConvertMem2Var3(l, pm);
  30. }
使用这种宏,让代码简洁明了。这样就不用写N个ConvertMem2Var函数了。而且一个赋值语就可以执行一系列很复杂的操作,可以在宏内做各种错误检查(如数值范围检查),编程时,只需要想着给哪个变量赋什么值,而不用考虑是否会出错。虽然inline的函数也可以实现类似的功能,但函数对中变量的必须是固定的类型,还可能不好优化。如:

点击(此处)折叠或打开

  1. int ConvertMem2Var2(char *mem, int len)
  2. {
  3.     int *_p = (int*)mem;
  4.     switch(len)
  5.     {
  6.         case 1: _p++;
  7.         case 2: _p += 2;
  8.     }
  9.     return _p;
  10. }

其它的一些宏:
点击(此处)折叠或打开
  1. #define max(a,b) ((a) > (b) ? (a) : (b))

  2. #define maxint(a,b) \
  3.        ({int _a = (a), _b = (b); _a > _b ? _a : _b; })

  4. #define GetReturn(a) ({__typeof__(a) b = (a); b + 3; })
  5. #define GetReturn(a) ({typeof(a) b = (a); b + 3; })
  6. #define macro(array) typeof (*(array)) *_SEARCH_array = (array);
  7. #define GetReturn(a) ({do{ \
  8.     typeof(a) *pa = &a; \
  9.     while(*pa){ \
  10.      a++; \
  11.      if((*pa % 4) == 3) goto Return; \
  12.      a+=2; \
  13.      if((*pa / 3) == 4) goto Return; \
  14.      a+=3; \
  15.     } \
  16.     Return: \
  17.      a; \
  18.     })

  19. int i;
  20. short si = 1234;
  21. i = max(si, 2);
  22. i = maxint(si, 2);
  23. i = GetReturn(si);





阅读(1847) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~