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....
  • 相关阅读:
    1 . CentOS 7的yum更换为国内的阿里云yum源
    0. vagrant+vbox创建centos7虚拟机
    git上传到码云和下载到本地
    spring boot udp或者tcp接收数据
    你好,博客园
    使用firdder抓取APP的包
    初见loadrunner
    sublime快捷键大全
    html中行内元素与块级元素的区别。
    html.css溢出
  • 原文地址:https://www.cnblogs.com/iplus/p/4467305.html
Copyright © 2011-2022 走看看