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

时间:2013-11-04 19:56:29

标签: c++ arrays

我认为我应该为 allData 的以下char数组定义得到编译错误:

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);
   ....
}

为什么呢?它会产生运行时错误吗?

2 个答案:

答案 0 :(得分:8)

gccclang以及其他可能visual C++,但支持variable length arrays扩展,即使它是 C99 功能而不是C ++特性。

gccclang中,如果您使用-pedantic进行编译,他们会警告您使用了扩展程序,例如gcc会对此产生类似的警告:

warning: ISO C++ forbids variable length array ‘allData’ [-Wvla]

您可以使用-pedantic-errors将警告变为错误。

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

  

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

虽然C ++草案标准需要一个常量,但8.3.4 Arrays 部分中的草案C ++标准说:

  

在声明T D中,D的格式为

     
    

D1 [constant-expressionopt] attribute-specifier-seqopt

  
     

[..]如果存在constant-expression(5.19),它应该是std :: size_t类型的转换常量表达式,并且其值应大于零。 [...]

答案 1 :(得分:2)

某些C ++编译器有一个允许在C ++中使用C VLA的选项。