我有一个颜色代码数组,其大小在编译时已知。我想声明另一个相同大小的数组。但下面的代码会引发错误。
当然,我可以将大小声明为全局常量,然后在两个数组的声明中使用它。但我不想在添加新颜色时不断调整大小常量。有办法吗?(变量是全局的。)
static const char *colors[] = {"#0000ff",
"#00ff00",
"#ff0000",
"#ffff00",
"#ff00ff",
"#00ffff",
"#ffffff",
"#000000",
"#ff8040",
"#c0c0c0",
"#808080",
"#804000"};
static const int NUM_COLORS = sizeof(colors) / sizeof(colors[0]);
static ColorButtons color_buttons[NUM_COLORS];
与 C++ 相反,在 C 中,带有限定符的变量
const
不是编译时常量表达式的一部分。并且,您不能在文件范围或带有存储类说明符的块范围中定义具有静态存储持续时间的可变长度数组static
。相反,你可以写例如
另一种方法如下
尽管有两次使用了这个表达
sizeof(colors) / sizeof(colors[0])
。或者如果你的编译器支持 C23 那么
如果指定了文件范围数组的大小,则它必须是整型常量表达式。 用 限定的变量
const
不符合表达式的条件(这与允许这样做的 C++ 不同)。不要将
NUM_COLORS
其创建为变量,而是将其创建为预处理器符号:扩展后的表达式是一个整数常量表达式,因此可以用作数组的大小。
您唯一需要注意的是确保不要
colors
在较低范围内重新定义您也会使用的NUM_COLORS
。static const int NUM_COLORS
-const
变量不是作为静态存储持续时间数组的大小所需的常量表达式。您需要创建一个宏定义:
补充一下以前的 答案:
它也可以重复使用。
如果您不确定数组是否有任何元素(又名可能是空指针),在这种情况下您可以返回 0:
再次传播 X-macros - 这是它们的完美任务。您需要做的就是在顶部维护一个 X 宏列表,然后您可以在编译时获得字符串文字、值、项目计数、查找表等。非常强大且易于维护,但对于那些不习惯阅读 X 宏代码的人来说,可读性会受到影响。
例子:
输出: