c - 确保数组在编译时填充到大小

标签 c arrays

如何确保在编译时将 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/

相关文章:

C文本游戏段错误及调试

我可以在 Microchip C18 中制作一个接受 ram 和 rom 指针的函数吗?

使用多维数组的 PHP 内容旋转器

Javascript 3 维数组赋值错误

c++ - 将 unsigned char * buffer 转换为可以接受参数的可调用 void 指针

c - 使用 C 程序(fopen、fread、fwrite)扫描 USB 驱动器

javascript - 显示投票数最多的数组

javascript - 适用于 obj 和数组的函数 - JS

python - 类型错误 : only size-1 arrays can be converted to Python scalars (matplotlib)

c - 使用 C 替换文本文件中的行