首页 >后端开发 >C++ >为什么 C 编译器接受可变长度数组,尽管它们是非标准的?

为什么 C 编译器接受可变长度数组,尽管它们是非标准的?

Patricia Arquette
Patricia Arquette原创
2024-12-22 02:46:15384浏览

Why Do C   Compilers Accept Variable Length Arrays Despite Them Being Non-Standard?

C 中的可变长度数组:尽管处于非标准状态,编译器仍接受

在 C 中,可变长度数组 (VLA) 不是标准。然而,像 g 和 clang 这样的编译器令人惊讶地接受 VLA 声明,尽管带有有关非标准用法的警告消息。这种意外行为引发了有关编译器动机和标准对 VLA 立场的疑问。

编译器接受

尽管 VLA 具有非标准性质,但编译器仍接受 VLA 背后的原因取决于编译器作者的决定。 C 编译器,特别是 GCC,优先考虑与旧版 C 编译器的兼容性,包括支持历史上可接受但不符合 C 标准的功能。这种兼容性优先的方法解释了编译器不愿意拒绝 VLA 声明。

标准解释

C 标准明确禁止在 [dcl.array] 中使用 VLA 。它规定数组声明必须使用常量表达式指定大小,而 VLA 则不然。换句话说,C 本身并不支持分配在运行时确定大小的数组。

编译器实现

尽管标准禁止,但接受 VLA 的编译器仍然这样做通过将它们实现为语言的扩展。确切的实现因编译器和平台而异。然而,检查编译器生成的汇编代码会发现,VLA 声明通常映射到堆栈分配的数组,类似于常规数组的实现方式。

结论

编译器在 C 中接受 VLA 是偏离语言标准的编译器扩展的一个示例。虽然此类扩展在特定情况下可能有用,但了解它们的局限性并谨慎使用它们至关重要。开发人员可以依靠编译器警告和文档来确定 VLA 扩展在其目标编译器环境中的可用性和行为。

以上是为什么 C 编译器接受可变长度数组,尽管它们是非标准的?的详细内容。更多信息请关注PHP中文网其他相关文章!

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