gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:28 25 4
gpt4 key购买 nike

我们已经知道,VLA (在 C99 中标准化)不是 C++ 标准的一部分。

所以下面的代码在 C++ 中是“非法的”:

void foo(int n) {
int vla[n];
for (int i = 0; i < n; ++i) {
vla[i] = i;
}
}

尽管如此,编译器(g++clang++)接受代码作为有效语法,只产生一个警告 以防 -pedantic 标志启用

ISO C++ forbids variable length array ‘vla’ [-Wvla]

我的问题是:

  • 为什么编译器接受该声明?
    编译器不能拒绝长度为[is-no-know-at-compile-time]的数组?
    是否有某种兼容性语法规则可遵循?

  • 标准说明了什么?
    从生成的汇编代码中,我看到编译器在堆栈中写入在循环中,就像普通数组一样,但我找不到任何关于标准行为的信息。

最佳答案

Why does the compiler accept that declaration?

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

GCC 特别允许,默认情况下,许多非标准的东西在历史上被旧的 C 编译器接受。他们喜欢这种意义上的“兼容性”。

What does the standard say about [it]?

准确地说是警告中的内容:ISO C++ 禁止可变长度数组。

C++ 没有 VLA。

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

关于c++ - C++ 编译器中的可变长度数组 (VLA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46936232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com