首页 >后端开发 >C++ >为什么有些编译器允许 C 语言中的可变长度数组,而其他编译器则不允许?

为什么有些编译器允许 C 语言中的可变长度数组,而其他编译器则不允许?

Patricia Arquette
Patricia Arquette原创
2024-12-17 11:05:26992浏览

Why Do Some Compilers Allow Variable Length Arrays in C   While Others Don't?

可变长度数组和常量表达式

下面提供的 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn