简单但具体的数组编译错误(C)
Simple but specific array compiling error (C)
这是我写的:
const int MAX=100;
int main (){
int notas [MAX]={0};
编译器表示如下:
[Error] variable-sized object may not be initialized
[Warning] excess elements in array initializer
当我用 #define MAX 100
写 MAX
时,它起作用了。但是我不明白这样做有什么问题?
在这种情况下
const int MAX=100;
不创建编译时常量,因此数组被视为 VLA。根据定义,无法初始化 VLA,因此会出现错误。
另一方面,#define MAX 100
是预处理器宏,基于文本替换属性,它的编译时间常数值为100
,然后该数组不是 VLA,可以按照初始化规则进行初始化。
这个
const int MAX=100;
int main (){
int notas [MAX]={0};
是可变长度数组的声明,其大小在 运行 时确定,因为变量 MAX 的声明不是 C 中的编译时常量。此类数组可能无法初始化在声明中。
来自C标准(6.7.9初始化)
3 The type of the entity to be initialized shall be an array of
unknown size or a complete object type that is not a variable length
array type.
所以你可以这样写
const int MAX=100;
int main (){
int notas [MAX];
memset( notas, 0, MAX * sizeof( int ) );
否则你可以使用像
这样的编译时间常量
enum { MAX=100 };
int main (){
int notas [MAX]={0};
尽管声明中有const
const int MAX = 100;
MAX
不是 常量表达式 (即,其值在编译时已知的东西)。它的值直到 运行 时间 才知道,因此 notas
的声明被视为可变长度数组声明,而 VLA 声明可能没有初始化程序(也不能在文件范围内声明 VLA,也不能是 struct
或 union
类型的成员)。
使用预处理器宏
#define MAX 100
符号 MAX
的所有实例在预处理后都被文字 100
替换,因此它实际上与写入
相同
int notas[100] = {0};
这就是使用预处理器宏有效的原因。
这是我写的:
const int MAX=100;
int main (){
int notas [MAX]={0};
编译器表示如下:
[Error] variable-sized object may not be initialized
[Warning] excess elements in array initializer
当我用 #define MAX 100
写 MAX
时,它起作用了。但是我不明白这样做有什么问题?
在这种情况下
const int MAX=100;
不创建编译时常量,因此数组被视为 VLA。根据定义,无法初始化 VLA,因此会出现错误。
另一方面,#define MAX 100
是预处理器宏,基于文本替换属性,它的编译时间常数值为100
,然后该数组不是 VLA,可以按照初始化规则进行初始化。
这个
const int MAX=100;
int main (){
int notas [MAX]={0};
是可变长度数组的声明,其大小在 运行 时确定,因为变量 MAX 的声明不是 C 中的编译时常量。此类数组可能无法初始化在声明中。
来自C标准(6.7.9初始化)
3 The type of the entity to be initialized shall be an array of unknown size or a complete object type that is not a variable length array type.
所以你可以这样写
const int MAX=100;
int main (){
int notas [MAX];
memset( notas, 0, MAX * sizeof( int ) );
否则你可以使用像
这样的编译时间常量 enum { MAX=100 };
int main (){
int notas [MAX]={0};
尽管声明中有const
const int MAX = 100;
MAX
不是 常量表达式 (即,其值在编译时已知的东西)。它的值直到 运行 时间 才知道,因此 notas
的声明被视为可变长度数组声明,而 VLA 声明可能没有初始化程序(也不能在文件范围内声明 VLA,也不能是 struct
或 union
类型的成员)。
使用预处理器宏
#define MAX 100
符号 MAX
的所有实例在预处理后都被文字 100
替换,因此它实际上与写入
int notas[100] = {0};
这就是使用预处理器宏有效的原因。