http://blog.csdn.net/crazycoder8848/article/details/8292770

=====================================================

typedef struct
{char a[100];
} T_XXX;typedef struct
{char a[99];
} T_QQQ;/* 检测结构体的大小是否等于特定值 */
#define    SIZE_OF_TYPE_EQUAL_TO(type, size) \
static inline char size_of_##type##_equal_to_##size() \
{ \char __dummy1[sizeof(type) - size]; \char __dummy2[size - sizeof(type)]; \return __dummy1[-1] + __dummy2[-1]; \
}/* 检测结构体的大小是否不等于特定值 */
#define    SIZE_OF_TYPE_UNEQUAL_TO(type, size) \
static inline char size_of_##type##_unequal_to_##size() \
{ \char __dummy1[0==(10/(sizeof(type)-size))]; \return __dummy1[-1]; \
}/* 检测结构体的大小是否不大于特定值 */
#define    SIZE_OF_TYPE_NOT_LARGER_THAN(type, size) \
static inline char size_of_##type##_not_larger_than_##size() \
{ \char __dummy1[size - sizeof(type)]; \return __dummy1[-1]; \
}/* 检测结构体的大小是否不小于特定值 */
#define    SIZE_OF_TYPE_NOT_SMALLER_THAN(type, size) \
static inline char size_of_##type##_not_smaller_than_##size() \
{ \char __dummy1[sizeof(type) - size]; \return __dummy1[-1]; \
}/* 检测结构体的大小是否小于特定值 */
#define    SIZE_OF_TYPE_SMALLER_THAN(type, size) \SIZE_OF_TYPE_NOT_LARGER_THAN(type, size) \SIZE_OF_TYPE_UNEQUAL_TO(type, size)/* 检测结构体的大小是否大于特定值 */
#define    SIZE_OF_TYPE_LARGER_THAN(type, size) \SIZE_OF_TYPE_NOT_SMALLER_THAN(type, size) \SIZE_OF_TYPE_UNEQUAL_TO(type, size)/* 检测结构体的大小是否小于特定值 版本2 */
#define    SIZE_OF_TYPE_SMALLER_THAN2(type, size) \
static inline char size_of_##type##_smaller_than2_##size() \
{ \char __dummy1[size - sizeof(type) - 1]; \return __dummy1[-1]; \
}/* 检测结构体的大小是否大于特定值 版本2 */
#define    SIZE_OF_TYPE_LARGER_THAN2(type, size) \
static inline char size_of_##type##_larger_than2_##size() \
{ \char __dummy1[sizeof(type) - size - 1]; \return __dummy1[-1]; \
}/* 检测结构体的大小是否为特定值的整数倍 */
#define    SIZE_OF_TYPE_IS_MULTIPLE_OF(type, size) \
static inline char size_of_##type##_is_multiple_of_##size() \
{ \char __dummy1[0 - (sizeof(type) % size)]; \return __dummy1[-1]; \
}/***好了,现在开始,想检查什么,调用相应的宏即可。如果结构大小不符合要求,则会编译出错。注意,对宏的调用,不要写在任何函数内 :-)
***/
SIZE_OF_TYPE_EQUAL_TO(T_XXX, 100)
SIZE_OF_TYPE_UNEQUAL_TO(T_XXX, 99)
SIZE_OF_TYPE_NOT_LARGER_THAN(T_XXX, 100)
SIZE_OF_TYPE_NOT_SMALLER_THAN(T_QQQ, 98)
SIZE_OF_TYPE_LARGER_THAN(T_QQQ, 96)
SIZE_OF_TYPE_SMALLER_THAN(T_QQQ, 200)SIZE_OF_TYPE_LARGER_THAN2(T_QQQ, 96)
SIZE_OF_TYPE_SMALLER_THAN2(T_QQQ, 200)
SIZE_OF_TYPE_IS_MULTIPLE_OF(T_QQQ, 9)int main()
{return 0;
}

转载于:https://www.cnblogs.com/iplus/archive/2013/04/07/4467305.html

利用宏定义在编译阶段检查结构体大小的方法相关推荐

  1. c++ 编译时检测结构体大小的的宏定义写法

    一种写法: template <bool> struct CompileAssert {};#define COMPILE_ASSERT(expr, msg) \typedef Compi ...

  2. c语言编译时检查逻辑错误吗,C语言陷阱与技巧20节,自定义“编译时”assert方法,在代码编译阶段检查“逻辑”错误...

    在C语言程序开发中,程序员写代码时应该考虑的"面面俱到",这样才能写出功能稳定的程序.例如,在实现 open() 函数时,先完成它的功能固然是重要的,但是程序员还需要考虑各种&qu ...

  3. 【转】彻底搞清计算结构体大小和数据对齐原则

    数据对齐: 许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是 某个值K(通常是2,4或8)的倍数.这种对齐限制简化了形成处理器和存储器系统之间的接口的硬件 设计.例如, ...

  4. 【C语言进阶深度学习记录】二十 结构体大小计算与结构体内存布局的详细方法

    结构体大小的计算往往是面试笔试常考的知识.对于简单的结构体,可以一眼看出来,对于复杂的结构体,该如何计算结构体占用内存的大小呢? 本文学习所使用的编译器是gcc 4.4.5 使用其他编译器或者使用Wi ...

  5. C语言结构体详解(结构体定义,使用,结构体大小等)

    c语言结构体详解 1.c语言结构体 1.1 结构体基础知识 1.2 结构体声明 1.3 结构体特殊声明 1.4 结构体的自引用 1.5 结构体的大小的计算 1.5.1了解结构体大小计算规则 1.5.2 ...

  6. std::tuple、std::tie(可用于结构体大小比较)、std::pair用法

    1.tuple应用: 解释:是一个元组,可包含无限多不同类型变量,pair的升级版,但没有pair得成员变量first.second. 1.1.代码: // tuple example #includ ...

  7. C语言结构体大小及对齐问题 · 续

    写在前面: 本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉. 在之前的 C语言结构体大小及对齐问题 文章 ...

  8. 结构体大小计算与位域大小计算

    结构体大小计算与位域大小计算 本博文纯属个人理解,有错误请多指正. 首先,各个变量所占的字节: 类型 字节(64位) 字节(32位) char 1 1 unsigned char 1 1 short ...

  9. C/C++ sizeof函数解析——解决sizeof求结构体大小的问题

    C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 参考文章: (1)C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 (2)https://www.cnbl ...

最新文章

  1. 赠书福利 | Tidio AI 趋势报告:约42%受访者能够接受机器人伴侣
  2. php和js序列化,PHP中serialize和json序列化与反序列化的区别
  3. 二维与三维之间的桥梁——点云
  4. STL_算法_元素计数(count、count_if)
  5. 推荐10个优秀GitHub仓库
  6. c语言因子优化算法,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...
  7. sap生产工单报工_SAP作业分割与作业价格计算说明
  8. 数据增强 | 小综述
  9. canvas简易人机五子棋
  10. Android Studio设置签名密钥
  11. 各种类型文件头特征码
  12. java爬取前程无忧(51job)
  13. WIN32 2048游戏
  14. Java——字母大小写全排列
  15. oracle prompt出错,Oracle 用 sqlprompt 修改 sqlplus 提示符
  16. FreeModbus library 程序详解
  17. 获得汉字字符串拼音首字母 .
  18. 大淘宝服务端技术干货沉淀和总结
  19. C++实用案例:整数四则运算计算器
  20. Spring Aop详尽教程

热门文章

  1. Mule,目前综合状态最良好的开源ESB方案引文
  2. java main方法里调用mapper
  3. 学习总结5 - bootstrap学习记录1__安装
  4. 区块链开发公司谈区块链在商业上的应用
  5. 前端解决跨域问题的8种方案
  6. codeforces 234E Champions' League
  7. UML该元素的行为为基础的元素
  8. sqlite简单介绍
  9. JS中的Replace方法
  10. 【017】◀▶ C#学习(九) - ADO.NET