利用宏定义在编译阶段检查结构体大小的方法
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
利用宏定义在编译阶段检查结构体大小的方法相关推荐
- c++ 编译时检测结构体大小的的宏定义写法
一种写法: template <bool> struct CompileAssert {};#define COMPILE_ASSERT(expr, msg) \typedef Compi ...
- c语言编译时检查逻辑错误吗,C语言陷阱与技巧20节,自定义“编译时”assert方法,在代码编译阶段检查“逻辑”错误...
在C语言程序开发中,程序员写代码时应该考虑的"面面俱到",这样才能写出功能稳定的程序.例如,在实现 open() 函数时,先完成它的功能固然是重要的,但是程序员还需要考虑各种&qu ...
- 【转】彻底搞清计算结构体大小和数据对齐原则
数据对齐: 许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是 某个值K(通常是2,4或8)的倍数.这种对齐限制简化了形成处理器和存储器系统之间的接口的硬件 设计.例如, ...
- 【C语言进阶深度学习记录】二十 结构体大小计算与结构体内存布局的详细方法
结构体大小的计算往往是面试笔试常考的知识.对于简单的结构体,可以一眼看出来,对于复杂的结构体,该如何计算结构体占用内存的大小呢? 本文学习所使用的编译器是gcc 4.4.5 使用其他编译器或者使用Wi ...
- C语言结构体详解(结构体定义,使用,结构体大小等)
c语言结构体详解 1.c语言结构体 1.1 结构体基础知识 1.2 结构体声明 1.3 结构体特殊声明 1.4 结构体的自引用 1.5 结构体的大小的计算 1.5.1了解结构体大小计算规则 1.5.2 ...
- std::tuple、std::tie(可用于结构体大小比较)、std::pair用法
1.tuple应用: 解释:是一个元组,可包含无限多不同类型变量,pair的升级版,但没有pair得成员变量first.second. 1.1.代码: // tuple example #includ ...
- C语言结构体大小及对齐问题 · 续
写在前面: 本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉. 在之前的 C语言结构体大小及对齐问题 文章 ...
- 结构体大小计算与位域大小计算
结构体大小计算与位域大小计算 本博文纯属个人理解,有错误请多指正. 首先,各个变量所占的字节: 类型 字节(64位) 字节(32位) char 1 1 unsigned char 1 1 short ...
- C/C++ sizeof函数解析——解决sizeof求结构体大小的问题
C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 参考文章: (1)C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 (2)https://www.cnbl ...
最新文章
- 赠书福利 | Tidio AI 趋势报告:约42%受访者能够接受机器人伴侣
- php和js序列化,PHP中serialize和json序列化与反序列化的区别
- 二维与三维之间的桥梁——点云
- STL_算法_元素计数(count、count_if)
- 推荐10个优秀GitHub仓库
- c语言因子优化算法,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...
- sap生产工单报工_SAP作业分割与作业价格计算说明
- 数据增强 | 小综述
- canvas简易人机五子棋
- Android Studio设置签名密钥
- 各种类型文件头特征码
- java爬取前程无忧(51job)
- WIN32 2048游戏
- Java——字母大小写全排列
- oracle prompt出错,Oracle 用 sqlprompt 修改 sqlplus 提示符
- FreeModbus library 程序详解
- 获得汉字字符串拼音首字母 .
- 大淘宝服务端技术干货沉淀和总结
- C++实用案例:整数四则运算计算器
- Spring Aop详尽教程