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中文网其他相关文章!