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

时间:2018-09-21 03:53:41

标签: c

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

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 个答案:

答案 0 :(得分:1)

  

是否有一种方法可以在编译时检查所有成员是否都已初始化(?)

C中没有部分初始化,它是全部或全部。未显式初始化的元素将使用默认值进行初始化。


为帮助检测from django.utils.safestring import mark_safe class PreferencesForm(forms.Form): EMOTIONS = [ ('', 'Joy'), ('', 'Sad'), ('', 'Angry'), ('', 'Tired'), ('', mark_safe('<i class="far fa-smile"></i>')), ] FAMOUS_PEOPLE = [ ('US', 'Abraham Lincoln'), ('MX', 'Frida Khalo'), ('IT', 'Leonardo da Vinci'), ('FR', 'Napoleon Bonaparte'), ('JP', 'Hayao Miyazaki'), ] emotion = forms.ChoiceField(choices=EMOTIONS, widget=forms.RadioSelect()) famous_person = forms.ChoiceField(choices=FAMOUS_PEOPLE, widget=forms.RadioSelect()) 是否为预期大小,一种方法使用了image_format_validators[]。如果 constant-expression 不等于0,则一切正常。否则,“实现将产生包含字符串文字的诊断消息” C11§6.7.103

_Static_assert(constant-expression , string-literal)

上面的内容仍然会被愚弄,但是确实可以确保映射到数组的顺序枚举类型具有预期的N个数组元素。


如果不使用C11,请参见编译时检查替代方法:C_ASSERT(expr)