zoukankan      html  css  js  c++  java
  • 利用宏定义在编译阶段检查结构体大小的方法

    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;
    }



    Meet so Meet. C plusplus I-PLUS....
  • 相关阅读:
    深入浅出:了解前后端分离优势、前后端接口联调以及优化问题
    深入浅出:了解JavaScript中的call,apply,bind的差别
    Vue2.0 搭建Vue脚手架(vue-cli)
    深入浅出:promise的各种用法
    深入浅出:了解常见的设计模式(闭包、垃圾回收机制)
    sql server xml 功能
    sqlite 用法
    PowerDesigner使用
    asp.net 开发注意的几点
    vue template
  • 原文地址:https://www.cnblogs.com/iplus/p/4467305.html
Copyright © 2011-2022 走看看