Chinaunix首页 | 论坛 | 博客
  • 博客访问: 119327
  • 博文数量: 18
  • 博客积分: 285
  • 博客等级: 二等列兵
  • 技术积分: 201
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-02 11:26
文章分类

全部博文(18)

文章存档

2015年(2)

2014年(4)

2012年(12)

我的朋友

分类: C/C++

2014-04-28 16:43:28

原文:http://blog.csdn.net/dadoneo/article/details/8766972
        工作中有个存储在flash中的结构体由于里面宏控制很复杂,所以其大小变化很大,而这个大小是受限的,常常稍不注意这个结构体大了会引起很严重的后果。网上查到一种方法在编译阶段检查结构体大小,利用的是数组大小限制和一些非法的运算编译错误提示实现。实现方法如下:

点击(此处)折叠或打开

  1. typedef struct
  2. {
  3.     char a[100];
  4. }T_XXX;

  5. typedef struct
  6. {
  7.     char a[99];
  8. }T_QQQ;

  9.  

  10. /*检测结构体的大小是否等于特定值*/
  11. #define SIZE_OF_TYPE_EQUAL_TO(type,size)\
  12. static inline char size_of_##type##_equal_to_##size()\
  13. {\
  14.     char __dummy1[sizeof(type)-size];\
  15.     char __dummy2[size-sizeof(type)];\
  16.     return __dummy1[-1]+__dummy2[-1];\
  17. }

  18.  

  19. /*检测结构体的大小是否不等于特定值*/
  20. #define SIZE_OF_TYPE_UNEQUAL_TO(type,size)\
  21. static inline char size_of_##type##_unequal_to_##size()\
  22. {\
  23.     char __dummy1[0==(10/(sizeof(type)-size))];\
  24.     return __dummy1[-1];\
  25. }

  26.  

  27. /*检测结构体的大小是否不大于特定值*/
  28. #define SIZE_OF_TYPE_NOT_LARGER_THAN(type,size)\
  29. static inline char size_of_##type##_not_larger_than_##size()\
  30. {\
  31.     char __dummy1[size-sizeof(type)];\
  32.     return __dummy1[-1];\
  33. }

  34.  

  35. /*检测结构体的大小是否不小于特定值*/
  36. #define SIZE_OF_TYPE_NOT_SMALLER_THAN(type,size)\
  37. static inline char size_of_##type##_not_smaller_than_##size()\
  38. {\
  39.     char __dummy1[sizeof(type)-size];\
  40.     return __dummy1[-1];\
  41. }

  42.  

  43. /*检测结构体的大小是否小于特定值*/
  44. #define SIZE_OF_TYPE_SMALLER_THAN(type,size)\
  45.     SIZE_OF_TYPE_NOT_LARGER_THAN(type,size)\
  46.     SIZE_OF_TYPE_UNEQUAL_TO(type,size)

  47.  

  48. /*检测结构体的大小是否大于特定值*/
  49. #define SIZE_OF_TYPE_LARGER_THAN(type,size)\
  50.     SIZE_OF_TYPE_NOT_SMALLER_THAN(type,size)\
  51.     SIZE_OF_TYPE_UNEQUAL_TO(type,size)

  52.  

  53. /*检测结构体的大小是否小于特定值 版本2*/
  54. #define SIZE_OF_TYPE_SMALLER_THAN2(type,size)\
  55. static inline char size_of_##type##_smaller_than2_##size()\
  56. {\
  57.     char __dummy1[size-sizeof(type)-1];\
  58.     return __dummy1[-1];\
  59. }

  60.  

  61. /*检测结构体的大小是否大于特定值 版本2*/
  62. #define SIZE_OF_TYPE_LARGER_THAN2(type,size)\
  63. static inline char size_of_##type##_larger_than2_##size()\
  64. {\
  65.     char __dummy1[sizeof(type)-size-1];\
  66.     return __dummy1[-1];\
  67. }

  68.  

  69. /*检测结构体的大小是否为特定值的整数倍*/
  70. #define SIZE_OF_TYPE_IS_MULTIPLE_OF(type,size)\
  71. static inline char size_of_##type##_is_multiple_of_##size()\
  72. {\
  73.     char __dummy1[0-(sizeof(type)%size)];\
  74.     return __dummy1[-1];\
  75. }

  76. /***
  77.     好了,现在开始,想检查什么,调用相应的宏即可。
  78.     如果结构大小不符合要求,则会编译出错。
  79.     注意,对宏的调用,不要写在任何函数内:-)
  80. ***/
  81. SIZE_OF_TYPE_EQUAL_TO(T_XXX,100)
  82. SIZE_OF_TYPE_UNEQUAL_TO(T_XXX,99)
  83. SIZE_OF_TYPE_NOT_LARGER_THAN(T_XXX,100)
  84. SIZE_OF_TYPE_NOT_SMALLER_THAN(T_QQQ,98)
  85. SIZE_OF_TYPE_LARGER_THAN(T_QQQ,96)
  86. SIZE_OF_TYPE_SMALLER_THAN(T_QQQ,200)

  87. SIZE_OF_TYPE_LARGER_THAN2(T_QQQ,96)
  88. SIZE_OF_TYPE_SMALLER_THAN2(T_QQQ,200)
  89. SIZE_OF_TYPE_IS_MULTIPLE_OF(T_QQQ,9)

  90.  

  91. intmain()
  92. {
  93.     return 0;
  94. }
SIZE_OF_TYPE_EQUAL_TO(type, size):
     如果type != size,那么__dummy1  ,__dummy2这2个数组在定义时肯定有一个是负数,数组在分配大小时会将大小视为无符号型处理,那么此时这个数组的大小将会变得很大,例如-1是0xFFFFFFFF(32位机上),数组存在的位置要么是堆栈 char a[5];要么是代码段chara[5] = {0}; 而堆栈,内存大小总有限制,所以预编译器会检查,并报错。

SIZE_OF_TYPE_UNEQUAL_TO(type, size):
    如果2者相等,10/(sizeof(type)-size) 这个算数运算就会报错,0作除数了。

其他实现方法都采用了类似的原理。


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