C++ 为什么具有非常量值的数组定义没有编译错误?

C++ 为什么具有非常量值的数组定义没有编译错误?,c++,arrays,C++,Arrays,我想我应该得到allData的以下字符数组定义的编译错误: void MyClass::aMethod(const char* data, int size) { int headerSize = 50; MyHeader header; //size is not constant and unknown at compile time char allData[size + headerSize]; //<<<<<==== should

我想我应该得到allData的以下字符数组定义的编译错误:

void MyClass::aMethod(const char* data, int size)
{
   int headerSize = 50;
   MyHeader header;
   //size is not constant and unknown at compile time
   char allData[size + headerSize]; //<<<<<==== should not allowed!! but not error??
   memcpy(allData, &header, headerSize);
   memcpy(allData + headerSize, data, size);
   ....
}
void MyClass::aMethod(常量字符*数据,整数大小)
{
int headerSize=50;
我的头;
//大小不是常量,在编译时是未知的
char ALDATABAS[Stsich+HealeSesith];//

两个,并且可能还有其他的,尽管它是C99的特性而不是C++特性,但它支持扩展,

gcc
clang
中,如果您使用
-pedantic
编译,它们将警告您正在使用扩展,例如
gcc
将产生类似的警告:

warning: ISO C++ forbids variable length array ‘allData’ [-Wvla]
您可以使用
-pedanticerrors
将警告变成错误

据我所知,C++14可能支持可变长度数组。C99草案标准部分
6.7.5.2
数组声明器说:

[…]如果大小是整数常量表达式,并且元素类型具有已知的常量大小,则数组类型不是可变长度数组类型;否则,数组类型是可变长度数组类型。

< C++草案标准要求常数,在C++代码段>代码> >3.3.4>代码>数组中表示:

在声明T D中,其中D的形式为

D1[常量表达式pt]属性说明符seqopt

[……]如果存在常量表达式(5.19),则它应为std::size_t类型的转换常量表达式,且其值应大于零。[……]


<>一些C++编译器有一个选项,允许在C++中使用C VLA。< /P>错误。Abelnky:对于标准兼容的C++编译器来说,这是一个错误。@加布里埃尔。嗯,在你拼写改变之前,Petri错误不会让你得到任何地方。@ JuangopangZa:我想我很清楚如果你的编译器支持它,那就不是错误了。并非所有编译器都严格遵从100% C++。对于非法代码,需要一个诊断消息。一致编译器可以选择编译。