如何确保在编译时将 COLOR_NAMES 填充为正确的大小?如果添加了新颜色,比如 COLOR_4(因此 N_COLORS 会自动递增),编译器会告诉我 COLOR_NAMES 没有填充到大小。
我在网上找到的大多数答案都是针对运行时的,而不是编译时的。
这是用于 C 风格的表示法(不使用 STL 和其他库)。
enum Colors
{
COLOR_1,
COLOR_2,
COLOR_3,
N_COLORS;
};
const char* COLOR_NAMES[N_COLORS] =
{
/* COLOR_1 */ "Color1",
/* COLOR_2 */ "Color2",
/* COLOR_3 */ "Color3"
};
const char* Blah()
{
Colors color;
...
printf("%s blah blah\n", COLOR_NAMES(color));
}
最佳答案
对于此类数组和相应枚举的情况,标准做法是将“枚举大小成员”(在您的情况下为 N_COLORS
)与数组中的项目数进行比较。
要获得数组中的项数,只需将数组大小除以一个数组成员的大小即可。
因此:
_Static_assert(sizeof(COLOR_NAMES)/sizeof(*COLOR_NAMES) == N_COLORS,
"Array item missing!");
编辑:
哦,顺便说一句,为了使这个有意义,数组声明必须是const char* COLOR_NAMES[] =
,否则您将无法判断数组初始化列表中是否缺少初始化程序。
关于c - 确保数组在编译时填充到大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34669164/