众所周知,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。
在您看到一个被接受的地方,它是编译器扩展;要了解该编译器如何实现这种扩展,您必须询问编译器的作者(或检查其来源,如果适用)。
胡子哥哥
TA贡献1825条经验 获得超6个赞
该标准要求合格的编译器在遇到非法内容时必须“发出诊断”。完成此操作后,可以继续自由编译具有实现特定含义的代码。(请注意,“具有实现特定的含义”是“具有未定义的行为”的礼貌形式)。
森栏
TA贡献1810条经验 获得超5个赞
“禁止”有点强。通常,该标准不禁止扩展。只要实现能够正确处理格式正确的程序并发出所需的诊断信息,它就是合规实现。如果该实现还为某些格式错误的程序提供了可再现的行为,则它仍然是兼容的。该标准不关心格式错误的程序。
- 3 回答
- 0 关注
- 539 浏览
添加回答
举报
0/150
提交
取消