假设我声明了一个固定大小的数组并初始化了它的成员。有没有办法在编译时检查所有成员是否都已初始化,这样我就可以避免由于未初始化值而导致的错误?这是我正在处理的示例:
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
数组中被初始化。
Is there a way to check at compile time, if all members were initialized (?)
C 中没有部分初始化,它是全有或全无。未显式初始化的元素将使用默认值进行初始化。
为了帮助检测 image_format_validators[]
是否为预期大小,一种方法使用 _Static_assert(constant-expression , string-literal)
。如果 constant-expression 不等于 0,则一切正常。否则“实现应产生包含字符串文字文本的诊断消息” C11 §6.7.10 3
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");
以上内容仍然可能被愚弄,但确实可以很好地确保映射到数组的顺序枚举类型具有预期的 N 个数组元素。
如果不使用 C11,请参阅编译时检查备选方案:C_ASSERT(expr) .
我是一名优秀的程序员,十分优秀!