3

从什么时候开始这是有效的语法?(使用 g++ 4.6.3 工作)我应该搜索什么以找到有关此的更多信息(我习惯于新建/删除)?

#include <iostream>

int main(){
    size_t sz;
    std::cout<<"number?\n";
    std::cin>>sz;

    // This line
    float dynamic_arr[sz];

     //output the (uninitialized) value just to use the array.
     std::cout<<dynamic_arr[0]<<std::endl;
     return 0;
}
4

2 回答 2

8

Varialbe 长度数组 (VLA) 不是标准 C++,它们是编译器扩展。如果您希望代码可移植,则不应使用它。

如果您使用-Wvla -Werror标志编译,或者-Werror=vla,您的代码将产生错误

错误:使用了可变长度数组“dynamic_arr”[-Werror=vla]

于 2013-02-20T20:51:47.457 回答
1

标准 C++ 不支持 C99 和 g++ 的可变长度数组 (VLA)。

在标准 C++ 中,您可以使用 eg std::vector,如下所示(您的代码已修改):

#include <iostream>
#include <vector>

int main(){
    int sz;
    std::cout<<"number?\n";
    std::cin>>sz;

    // This line
    std::vector<double> dynamic_arr( sz );    // Initialized to zeroes.

     //output the value just to use the array.
     std::cout<<dynamic_arr[0]<<std::endl;
}

此外,对于您可以使用的字符串std::basic_string,通常通过typedefsstd::stringstd::wstring.

通常,主要问题只是动态大小,如上所述,然后很好地完成工作std::vectorstd::basic_string但是,有时问题是效率,如何对动态大小的数组进行极其高效的堆栈分配。许多 C 和 C++ 实现为此支持非标准函数alloca,但不幸的是,它们在处理故障的方式上存在很大差异。据我所知,也没有通用的图书馆解决方案。但令人高兴的是,我所知道的主要用途(尽管如前所述alloca可用于许多平台)一直用于 Windows 中的字符串编码翻译,随着时间的推移,它的相关性越来越低,而且 Windows 程序越来越纯面向 Unicode。

于 2013-02-20T21:19:33.210 回答