4

我想我应该得到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);
   ....
}

为什么?它会给出运行时错误吗?

4

2 回答 2

8

gcc和clang以及可能的其他人虽然不是可视 C++,但支持可变长度数组的扩展,即使它是C99功能而不是 C++ 功能。

在这两种情况下gccclang如果您使用它们进行编译,-pedantic它们会警告您正在使用扩展,例如gcc会产生与此类似的警告:

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

并且您可以使用-pedantic-errors将警告变成错误。

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

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

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

在声明 TD 中,其中 D 具有以下形式

D1 [常量表达式选择] 属性说明符-seqopt

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

于 2013-11-04T19:58:22.910 回答
2

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

于 2013-11-04T19:59:06.027 回答