[英]Why can't I use a constant int to declare an array AND initialize it in C?
选项 1:使用#define
#define kSize 5
int arr1[kSize] = {1,2,3,4,5};
--> 好的。
选项 2:使用enum
enum { eSize = 5 };
int arr2[eSize] = {1,2,3,4,5};
--> 好的。
但是,不能使用const int
:
const int cSize=5;
int arr3[cSize] = {1,2,3,4,5};
--> 失败。
为什么?
具有const
限定符的变量不符合integer 常量表达式的条件。 这使数组成为无法初始化的可变长度数组(VLA)。
C 标准的第 6.7.6.2p4 节描述了数组声明符状态:
如果大小不存在,则数组类型是不完整的类型。 如果大小是
*
而不是表达式,则数组类型是未指定大小的变长数组类型,它只能用于声明或类型名称中,function 原型 scope 这样的 ZA3CBC3F9D0CE2F2C1554E1B671 类型仍然是完整的。 如果大小是 integer 常量表达式并且元素类型具有已知的常量大小,则数组类型不是变长数组类型; 否则,数组类型是可变长度数组类型。 (可变长度 arrays 是实现不需要支持的条件特性;参见 6.10.8.3。)
因此,如果数组不是可变长度数组,它的大小必须是 integer 常量表达式。 这在第 6.6p6 节中定义:
An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants,
sizeof
expressions whose results are integer constants,_Alignof
expressions, and floating constants that are the immediate operands of casts. integer 常量表达式中的强制转换运算符只能将算术类型转换为 integer 类型,除非作为sizeof
或_Alignof
.operator 的操作数的一部分
#define
定义在编译阶段之前被预处理器替换,因此在第一种情况下kSize
与常量5
完全相同。 上面的段落还指出,枚举常量符合 integer 常量表达式,因此这使您的第二种情况正常。 第三种情况使用const
限定的变量,该变量未包含在 integer 常量表达式的定义中,因此这使其成为可变长度数组。
然后第 6.7.9p3 节规定了可以初始化的内容:
要初始化的实体的类型应该是一个未知大小的数组或一个完整的 object 类型而不是可变长度数组类型。
如上所述,无法初始化 VLA。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.