GNU编译器与Visual Studio在分配的数组中使用长度常量w /在范围内

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或以某种方式特别处理它.

我的问题是:

  1. 谁(VS或GNU)在如何处理这个方面更接近标准?
  2. 有没有办法做这个VS使用[]范围内的常量值,但不是const在整个程序中没有malloc调用的全局?
  3. 如果我在GNU编译的代码中使用它,是否有任何问题需要注意?

Joh*_*ode 5

语言的角度来看,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或文件范围; 具有静态存储持续时间的对象在程序启动时分配并保持到程序终止,如果我没有弄错,则不能保证对象将以任何特定顺序分配和初始化.所以那些项目需要在编译时知道它们的大小.