在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
与数组的实际大小不匹配,我希望编译器发出警告。
答案 0 :(得分:0)
Gcc documentation says
The storage is allocated at the point of declaration
for variable-sized arrays.
For an array to be initialized, its storage has to be allocated at compile time.
It is the optimizer that turns a const variable into a constant. But in order for a program to be optimized, it needs to be valid at first.
答案 1 :(得分:0)
我发现为什么类型const int
和const static int
的变量都不能用于声明数组:数组大小需要是一个常量表达式。在C中,常量表达式类似于文字常量或sizeof
表达式(后者仅在C99之后),但不是const
变量。奇怪的是,在C ++中,const
变量是一个常量表达式,可用于声明一个数组。