c++ - 如何强制数组初始值设定项具有与数组大小相同的项目数?
问题描述
我最近发现了这个错误:
enum class MyEnum
{
Enum1,
Enum2,
Enum3,
Count
};
const char* names[MyEnum::Count] =
{
"Enum1",
"Enum2",
};
static_assert(sizeof_array(names) == MyEnum::Count, "Name count mismatch");
除非您更改为,否则static_assert
here永远不会断言,我这样做了。names[MyEnum::Count]
names[]
有没有办法强制或检测具有显式大小和初始化程序的数组是否实际上初始化了整个数组,以防止这种类型的错误?
解决方案
添加一些杂乱的代码来检查这一点将防止错误再次出现在同一个地方,但不会阻止类似的错误出现在其他地方。如果这是您想要的,请考虑添加一个好的评论:
// `names[]` is correct, changing it to `names[X]` is a mistake, refer to #123.
const char* names[] = { /* ... */ };
如果您在许多地方都有类似的代码,请考虑编写自定义的 clang tidy 检查。
我自己从来没有写过自定义的clang tidy check,但它似乎是可行的,而且听起来像是一个很好的长期解决方案。