为了账号安全,请及时绑定邮箱和手机立即绑定

C ++编译器中的可变长度数组(VLA)

C ++编译器中的可变长度数组(VLA)

C++
哆啦的时光机 2019-12-04 11:09:42
众所周知,VLA(在C99中标准化)不是C ++中标准的一部分。因此,下面的代码在C ++中是“非法的”:void foo(int n) {  int vla[n];  for (int i = 0; i < n; ++i) {    vla[i] = i;  }}尽管编译器(g ++和clang ++)将代码作为有效语法接受,但如果启用了flag,则仅生成警告 。-pedanticISO C ++禁止使用可变长度数组'vla'[-Wvla]我的问题是:为什么编译器接受该声明?编译器不能只拒绝长度为[is-no-know-at-compile-time]?的数组?是否要遵循某种兼容语法规则?标准怎么说?从生成的汇编代码中,我看到编译器像正常数组一样在循环中写在堆栈中,但是我找不到关于标准行为的任何信息。
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

为什么编译器接受该声明?

因为它的作者选择这样做。

尤其是默认情况下,GCC允许许多非标准的东西,这些东西过去一直被旧的C编译器接受。他们喜欢这种意义上的“兼容性”。

该标准对[it]说了些什么?

确切地说,警告指出:ISO C ++禁止使用可变长度数组。

C ++没有VLA。

在您看到一个被接受的地方,它是编译器扩展;要了解该编译器如何实现这种扩展,您必须询问编译器的作者(或检查其来源,如果适用)。


查看完整回答
反对 回复 2019-12-04
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

该标准要求合格的编译器在遇到非法内容时必须“发出诊断”。完成此操作后,可以继续自由编译具有实现特定含义的代码。(请注意,“具有实现特定的含义”是“具有未定义的行为”的礼貌形式)。


查看完整回答
反对 回复 2019-12-04
?
森栏

TA贡献1810条经验 获得超5个赞

“禁止”有点强。通常,该标准不禁止扩展。只要实现能够正确处理格式正确的程序并发出所需的诊断信息,它就是合规实现。如果该实现还为某些格式错误的程序提供了可再现的行为,则它仍然是兼容的。该标准不关心格式错误的程序。

查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 539 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信