我以为C对我来说再没有惊喜了,但这令我感到惊讶。
const int NUM_FOO = 5;
....
int foo[NUM_FOO];
==>error C2057: expected constant expression
我的C ++经验使我在内部尽可能不赞成#define
。因此,这真是一个惊喜。 VS2019,使用/ TC编译。我认为C99仍然允许可变大小的数组。
有人可以解释为什么会出现拒绝,因为编译器在编译时肯定知道数组的大小吗?
C99是否允许可变大小数组?
const
没有声明编译时常量。如果要避免使用enum
并希望可以在调试器中显示的符号名称,则可以改用#define
常量。
C99 does支持VLA。但是,VS2019 does not support C99.
具有const
限定符的变量不符合常量表达式的条件。
关于常量表达式状态的C11 standard的6.6p6节
一个整数常量表达式应该具有整数类型,并且 只能有整数常量的操作数, 枚举常量,字符常量,
sizeof
表达式 其结果是整数常量,_Alignof
表达式和 浮点常量,它们是强制类型转换的直接操作数。投 整数常量表达式中的运算符只能转换 算术类型转换为整数类型,但作为sizeof
或_Alignof
运算符的操作数
注意,不包括const
个合格的整数对象。
这意味着int foo[NUM_FOO];
是一个可变长度的数组,从6.7.6.2p4节开始定义如下:
如果不存在大小,则数组类型为不完整的类型。如果 大小是
*
,而不是表达式,数组类型 是未指定大小的可变长度数组类型,可以 仅用于带有函数原型的声明或类型名称 范围;这样的数组仍然是完整的类型。 如果尺寸是 整数常量表达式,并且元素类型具有已知 常量大小,数组类型不是可变长度数组 类型;否则,数组类型为可变长度数组 类型。
关于您遇到的错误,这是因为Visual Studio不完全与C99兼容,并且不支持可变长度数组。