Jas*_*ick 4 c c++ arrays const dynamic
我知道如果你在c/c ++中设置一个动态值你不能在括号内使用该值来分配一个数组(这将使它成为所谓的可变长度数组(VLA),这是当前C++标准所做的不支持)...
即参见:
C++:可变长度数组
http://en.wikipedia.org/wiki/Variable-length_array
我不太了解(以及我在这里没有看到的内容)是为什么GNU c/c ++编译器(gcc,g++)可以使用基于整数值的动态分配(据我所知)这么久因为该值是数组分配范围内的常量,但是Visual Studio它不支持这个并且将拒绝编译代码,吐出错误.
例如in g++
void Foo(const unsigned int bar)
{
double myStuff[bar];
//... do stuff...
}
Run Code Online (Sandbox Code Playgroud)
...编译得很好......
但是,同样的代码在拒绝我使用VS的版本,除非不管我传递给巴编译是const在所有范围或者是#define,static const等
我怀疑GNU编译器可能会使用范围来推断该值是该范围内的常量,并且只是将其分配给malloc或以某种方式特别处理它.
我的问题是:
[]范围内的常量值,但不是const在整个程序中没有malloc调用的全局?从语言的角度来看,VLA仅在C中受支持,且仅在C99上受支持.它们在C++中不受支持.
从编译器的角度来看,g ++将支持VLA作为C90和C++的扩展,但如果使用-pedantic它进行编译将禁用这些扩展,并且您将收到编译错误.
Visual Studio中不支持VLAS 都用C或C++.VS仅支持C89标准,AFAIK MS根本没有计划支持后来的C标准.
就范围而言,这是在C标准中定义的:
6.7.6.2数组声明 符
...
2如果标识符被声明为具有可变修改类型,则它应是普通标识符(如6.2.3中所定义),没有链接,并且具有块范围或函数原型范围.如果标识符被声明为具有静态或线程存储持续时间的对象,则它不应具有可变长度数组类型.
技术原因导致无法声明VLA static或文件范围; 具有静态存储持续时间的对象在程序启动时分配并保持到程序终止,如果我没有弄错,则不能保证对象将以任何特定顺序分配和初始化.所以那些项目需要在编译时知道它们的大小.