为什么编译器将const长度的数组视为可变大小的对象?

时间:2016-04-25 08:27:44

标签: arrays initialization const c89

在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与数组的实际大小不匹配,我希望编译器发出警告。

2 个答案:

答案 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 intconst static int的变量都不能用于声明数组:数组大小需要是一个常量表达式。在C中,常量表达式类似于文字常量或sizeof表达式(后者仅在C99之后),但不是const变量。奇怪的是,在C ++中,const变量是一个常量表达式,可用于声明一个数组。