gpt4 book ai didi

C 警告缺少默认初始化的查找表条目

转载 作者:行者123 更新时间:2023-12-02 19:40:26 24 4
gpt4 key购买 nike

考虑以下代码片段:

enum test {
A,
B,
C
};

static const char *const table[] = {
[A] = "A",
//[B] = "B",
[C] = "C",
}; // the string representation is not (always) equivalent to the enum identifier

如果我不小心错过了某个条目(在本例中为 B),我希望收到编译器警告或错误。

尝试使用 clang -Weverything 和多个 gcc 警告(但没有警告 - 静默编译)。

此外,sizeof table/sizeof *table 仍然是 3

或者 C 中有没有一种方法可以在编译时检查所有数组元素是否为非 NULL?

// C++ variant
constexpr bool is_array_nonnull(const char *const array[]) {
for (int i = 0; i <= sizeof array / sizeof *array; ++i)
if (array[i] == nullptr)
return false;
return true;
}
static_assert(is_array_nonnull(table));

编辑:使需求和测试步骤更加清晰

最佳答案

为了防止这种情况发生,您可以使用一种称为X Macro的技术。

#define TESTLIST  X(A), X(B), X(C)

#define X(item) item
enum test { TESTLIST };
#undef X

#define X(item) [item] = #item
static const char *const table[] = { TESTLIST };
#undef X

扩展为

enum test { A, B, C };
static const char *const table[] = { [A] = "A", [B] = "B", [C] = "C" };

当您向列表添加(或删除)项目时,您只需修改 TESTLIST 宏。其余代码保持不变。

关于C 警告缺少默认初始化的查找表条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59438981/

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