为什么编译器认为具有 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
与数组的实际大小不匹配时发出警告。
The storage is allocated at the point of declaration
对于可变大小的数组。
对于要初始化的数组,必须在编译时分配其存储空间。
是优化器把const变量变成常量。但是一个程序要优化,首先要有效
我发现了为什么 const int
和 const static int
类型的变量都不能用来声明数组:数组大小需要是一个常量表达式。在 C 中,常量表达式类似于文字常量或 sizeof
表达式(后者仅自 C99 起),但不是 const
变量。奇怪的是,在 C++ 中,const
变量是一个常量表达式,可用于声明数组。
在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
与数组的实际大小不匹配时发出警告。
The storage is allocated at the point of declaration
对于可变大小的数组。
对于要初始化的数组,必须在编译时分配其存储空间。
是优化器把const变量变成常量。但是一个程序要优化,首先要有效
我发现了为什么 const int
和 const static int
类型的变量都不能用来声明数组:数组大小需要是一个常量表达式。在 C 中,常量表达式类似于文字常量或 sizeof
表达式(后者仅自 C99 起),但不是 const
变量。奇怪的是,在 C++ 中,const
变量是一个常量表达式,可用于声明数组。