为什么const int x = 5;不是C中的常量表达式?

问题描述 投票:2回答:2

我以为C对我来说再没有惊喜了,但这令我感到惊讶。

    const int NUM_FOO = 5;
    ....

    int foo[NUM_FOO];
==>error C2057: expected constant expression

我的C ++经验使我在内部尽可能不赞成#define。因此,这真是一个惊喜。 VS2019,使用/ TC编译。我认为C99仍然允许可变大小的数组。

  1. 有人可以解释为什么会出现拒绝,因为编译器在编译时肯定知道数组的大小吗?

  2. C99是否允许可变大小数组?

c const visual-studio-2019 c99 variable-length-array
2个回答
0
投票
    C中的
  1. const没有声明编译时常量。如果要避免使用enum并希望可以在调试器中显示的符号名称,则可以改用#define常量。

  2. C99 does支持VLA。但是,VS2019 does not support C99.


0
投票

具有const限定符的变量不符合常量表达式的条件。

关于常量表达式状态的C11 standard的6.6p6节

一个整数常量表达式应该具有整数类型,并且 只能有整数常量的操作数, 枚举常量,字符常量,sizeof表达式 其结果是整数常量,_Alignof表达式和 浮点常量,它们是强制类型转换的直接操作数。投 整数常量表达式中的运算符只能转换 算术类型转换为整数类型,但作为 sizeof_Alignof运算符的操作数

注意,不包括const个合格的整数对象。

这意味着int foo[NUM_FOO];是一个可变长度的数组,从6.7.6.2p4节开始定义如下:

如果不存在大小,则数组类型为不完整的类型。如果 大小是*,而不是表达式,数组类型 是未指定大小的可变长度数组类型,可以 仅用于带有函数原型的声明或类型名称 范围;这样的数组仍然是完整的类型。 如果尺寸是 整数常量表达式,并且元素类型具有已知 常量大小,数组类型不是可变长度数组 类型;否则,数组类型为可变长度数组 类型。

关于您遇到的错误,这是因为Visual Studio不完全与C99兼容,并且不支持可变长度数组。

© www.soinside.com 2019 - 2024. All rights reserved.