【发布时间】:2016-04-25 08:27:44
【问题描述】:
在 C 中,不能初始化可变大小的数组,即,
int size = 3;
int array[size] = {1, 2, 3}; /* error: variable-sized object may not be initialized */
我们可以将size 定义为预处理器宏以使其工作:
#define size (3)
int array[size] = {1, 2, 3}; /* works */
我更喜欢使用常量而不是宏,所以我想做:
const int size = 3;
int array[size] = {1, 2, 3}; /* error: variable-sized object may not be initialized */
问题:为什么最后一个变体不起作用?如果const 告诉编译器我无意修改变量,为什么它不推断出数组不是可变大小的?
我也尝试将size设为静态,但无济于事:
static const int size = 3;
int array[size] = {1, 2, 3}; /* error: variable-sized object may not be initialized */
注意:我知道我可以这样做
int array[] = {1, 2, 3};
但是,size 稍后用于迭代数组,因此如果size 与数组的实际大小不匹配,我希望编译器发出警告。
【问题讨论】:
-
这不是标准的 C89 结构,是吗?编译器是什么?
-
您指的是哪个构造?一切都使用 gcc-3.4.4 和 std=C89 编译(带有指示的错误)(除了 //-style cmets,我修复了)
-
"在 ISO C99 中允许使用可变长度自动数组,作为扩展,GCC 在 C90 模式和 C++ 中接受它们。"
-
你可以在C89中使用
int array[] = {1, 2, 3}; int size = sizeof(array)/sizeof(int); -
没错,虽然
sizeof(array)/sizeof(array[0])可能更好。
标签: arrays initialization constants c89