gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:15:29 25 4
gpt4 key购买 nike

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

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) .

关于编译时检查是否所有数组成员都已初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52436360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com