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....
  • 相关阅读:
    pytorch实现BiLSTM+CRF用于NER(命名实体识别)
    pytorch中如何处理RNN输入变长序列padding
    pytorch nn.LSTM()参数详解
    Pytorch的LSTM的理解
    转:pytorch版的bilstm+crf实现sequence label
    【Tensorflow】tf.nn.atrous_conv2d如何实现空洞卷积?膨胀卷积
    iOS iphone5屏幕适配 autosizing
    IOS文件存储小结
    IIS6_IIS7日志文件位置
    xcode中没有autoSizing的设置
  • 原文地址:https://www.cnblogs.com/iplus/p/4467305.html
Copyright © 2011-2022 走看看