代码之家  ›  专栏  ›  技术社区  ›  PoVa

编译时检查是否所有数组成员都已初始化

c
  •  1
  • PoVa  · 技术社区  · 7 年前

    假设我声明一个固定大小的数组并初始化它的成员。有没有一种方法可以在编译时检查所有成员是否都已初始化,这样我就可以避免由于单位化值而导致的错误?下面是我正在研究的一个例子:

    enum image_format {
        IMAGE_FORMAT_UBI = 0,
        IMAGE_FORMAT_BOOT,
        IMAGE_FORMAT_RAW,
        _IMAGE_FORMAT_LAST
    };
    
    #define IMAGE_FORMAT_COUNT (_IMAGE_FORMAT_LAST - IMAGE_FORMAT_UBI)
    
    static int image_format_validator_ubi(const char *filename);
    static int image_format_validator_boot(const char *filename);
    
    typedef int (*image_format_validator)(const char *filename);
    
    static image_format_validator image_format_validators[IMAGE_FORMAT_COUNT] = {
        [IMAGE_FORMAT_UBI]  = &image_format_validator_ubi,
        [IMAGE_FORMAT_BOOT] = &image_format_validator_boot,
        [IMAGE_FORMAT_RAW]  = NULL
    };
    

    在这种情况下,我想核实一下 IMAGE_FORMAT_COUNT image_format_validators 数组。

    1 回复  |  直到 7 年前
        1
  •  1
  •   chux    7 年前

    有没有办法在编译时检查所有成员是否都初始化了(?)

    在C语言中没有部分初始化,它要么全部初始化,要么一无所有。未显式初始化的元素将使用默认值进行初始化。


    帮助检测 image_format_validators[] 是预期的大小,一种方法使用 _Static_assert(constant-expression , string-literal) 常量表达式

    enum image_format {
        IMAGE_FORMAT_UBI = 0,
        IMAGE_FORMAT_BOOT,
        IMAGE_FORMAT_RAW,
        IMAGE_FORMAT_N
    };
    
    //                                                    v--- empty
    static image_format_validator image_format_validators[ ] = {
        [IMAGE_FORMAT_UBI]  = &image_format_validator_ubi,
        [IMAGE_FORMAT_BOOT] = &image_format_validator_boot,
        [IMAGE_FORMAT_RAW]  = NULL
    };
    
    #define IFV_N (sizeof image_format_validators/sizeof image_format_validators[0])
    _Static_assert(IFV_N == IMAGE_FORMAT_N, "Unexpected size");
    


    如果不使用C11,请参阅编译时检查选项: C_ASSERT(expr)