可变长度数组和常量表达式
下面提供的 C 代码片段有可能使用某些编译器成功编译:
int main() { int size = 10; int arr[size]; }
根据 C 标准 (8.3.4/1),此代码预计被拒绝,因为数组 (arr) 的大小需要是常量表达式。然而,它引发了有关 gcc 4.8 和 Clang 3.2 等编译器行为的问题。
可变长度数组 (VLA) 在这种情况下发挥作用。 VLA 是 gcc 和 clang 已作为 C 内的扩展实现的 C99 功能。然而,在这种情况下,Visual Studio 严格遵守标准。它生成的消息:
error C2466: cannot allocate an array of constant size 0
表明它正确地将大小解释为零,这在这种情况下是不允许的。
如果在 gcc 和 clang 中启用 -pedantic 标志,您将收到有关使用 VLA 的警告。例如,gcc 声明:
warning: ISO C++ forbids variable length array 'arr' [-Wvla] int arr[size]; ^
此外,使用 -pedantic-errors 标志将使此用法出现错误。有关支持的语言标准的更多信息,请参阅提供的文档。
C 标准草案在 5.19(常量表达式)中定义了整型常量表达式,如下所示:
“整型常量表达式是一个整型或无作用域枚举类型的表达式,隐式转换为纯右值,其中转换后的表达式是核心常量表达式。”
实现符合标准,您可以使用 const (或 constexpr)用文字初始化 size。这将使 size 成为整型常量表达式:
const int size = 10; // or constexpr int size = 10;
C99 草案标准 (6.7.5.2) 中的相应部分阐明,如果 size 不存在,则声明不完整的数组类型。如果大小为*,则创建一个没有定义长度的变长数组类型,并且只能在某些上下文中使用。否则,它是常规数组类型或基于表达式属性的可变长度数组类型。
以上是为什么有些编译器允许 C 语言中的可变长度数组,而其他编译器则不允许?的详细内容。更多信息请关注PHP中文网其他相关文章!