什么时候这个语法有效? (使用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;
}
答案 0 :(得分:8)
Varialbe长度数组(VLA)不是标准C ++,它们是编译器扩展。如果您希望代码可移植,则不应使用它。
如果使用-Wvla -Werror
标记或-Werror=vla
进行编译,则代码将产生错误
错误:使用可变长度数组'dynamic_arr'[-Werror = vla]
答案 1 :(得分:1)
标准C ++不支持C99和g ++的可变长度数组(VLA)。
在标准C ++中,您可以使用例如 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
,通常是typedef
s std::string
和std::wstring
。
一般来说,主要问题只是动态大小,如上所述,然后std::vector
和std::basic_string
可以很好地完成工作。但是,有时问题是效率,如何进行动态大小数组的极其高效的堆栈分配。许多C和C ++实现支持非标准函数 alloca
,但遗憾的是它们在处理失败方面有很大差异。据我所知,也没有常见的库解决方案。但幸运的是,我所知道的主要用法(尽管提到alloca
可用于许多平台)已经用于Windows中的字符串编码转换,并且随着时间的推移越来越不相关on和Windows程序越来越多地是纯粹面向Unicode的。