C+中的数组分配+;关于变长堆栈 我惊讶地发现,可以在C++中在堆栈上分配一个长度可变的数组(如 int数组[i];)。它似乎在clang和gcc(OS/X)上都可以正常工作,但MSVC 2012不允许

C+中的数组分配+;关于变长堆栈 我惊讶地发现,可以在C++中在堆栈上分配一个长度可变的数组(如 int数组[i];)。它似乎在clang和gcc(OS/X)上都可以正常工作,但MSVC 2012不允许,c++,visual-c++,g++,clang,C++,Visual C++,G++,Clang,这个语言特性叫什么?它是官方C++语言的特征吗?如果是的话,C++的哪一个版本? 完整示例: #include <iostream> using namespace std; int sum(int *array, int length){ int s = 0; for (int i=0;i<length;i++){ s+= array[i]; } return s; } int func(int i){ int a

这个语言特性叫什么?它是官方C++语言的特征吗?如果是的话,C++的哪一个版本? 完整示例:

#include <iostream>

using namespace std;

int sum(int *array, int length){
    int s = 0;
    for (int i=0;i<length;i++){
        s+= array[i];
    }
    return s;
}

int func(int i){
    int array[i]; // <-- This is the feature that I'm talking about
    for (int j=0;j<i;j++){
        array[j] = j;
    }

    return sum(array, i);

}

int main(int argc, const char * argv[])
{
    cout << "Func 1 "<<func(1)<<endl;
    cout << "Func 2 "<<func(2)<<endl;
    cout << "Func 3 "<<func(3)<<endl;

    return 0;
}
#包括
使用名称空间std;
整数和(整数*数组,整数长度){
int s=0;
对于(int i=0;i < p>您是在GCC扩展。这是GNU扩展,不是标准C++。< /P> < P>这是一个,它看起来不是标准C++。虽然在<代码> GCC < /C>和<代码> Cuang<代码>中,您可以使用<代码> -PoaNodidia<代码>,它将在 GCC < /C> >中给出这样的警告:

warning: ISO C++ forbids variable length array ‘array’ [-Wvla]
就像《代码》中的叮当声:

warning: variable length arrays are a C99 feature [-Wvla-extension]
此功能称为可变长度阵列或VLA

它是C99标准(也是C11)的一部分,但C++11不支持它。但是,正如您看到的,一些编译器接受它作为扩展

<> P>最后,在布里斯托尔(2013年4月)的C++委员会会议上批准了类似的特征(但与C99的VLAS完全不一样),在C++ 14中。 C99的VLA和C++14之间的两个主要区别如下所示:

void f(std::size_t n) {
    int a[n];
    unsigned int x = sizeof(a);
    // ...
    int matrix m[n][n];
}    
在C99中,表达式
sizeof(a)
在运行时计算。在C++14中,这是非法的。此外,C++14不支持多维VLA

有关C99 VLA的更多信息,请参阅DrDobb的文章

有关C++14运行时大小的数组的更多信息,请参阅布里斯托尔批准的论文

更新:在Chigago会议上,委员会决定从C++14中删除此功能,并将其放在单独的文档a(TS)中。此外,TS还包括模板类
dynarray
,该类与运行时边界数组有一定的关联


从C++14中删除它的主要原因是委员会希望在标准化这些功能之前从实现和用户体验中获得反馈。

在某些情况下,您可以使用
constexpr
(C++11)作为解决方法:

constexpr int getArraySize (int factor) {
    return 2 * factor + 1;
}

int my_array[getArraySize(3)];

实际上,在C++14中,这个限制不应该再存在了:

根据当前标准,这是不允许的。它是一个称为可变长度数组的编译器扩展。如果有合适的编译标志,您的代码将无法编译。我认为应该添加一点,即不应该使用它,因为它不会被其他编译器编译。