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