为什么编译器认为具有 const 长度的数组是可变大小的对象?

Why is an array with const length considered to be a variable-sized object by the compiler?

在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 与数组的实际大小不匹配时发出警告。

Gcc documentation

The storage is allocated at the point of declaration

对于可变大小的数组。

对于要初始化的数组,必须在编译时分配其存储空间。

是优化器把const变量变成常量。但是一个程序要优化,首先要有效

我发现了为什么 const intconst static int 类型的变量都不能用来声明数组:数组大小需要是一个常量表达式。在 C 中,常量表达式类似于文字常量或 sizeof 表达式(后者仅自 C99 起),但不是 const 变量。奇怪的是,在 C++ 中,const 变量是一个常量表达式,可用于声明数组。