我认为我应该为 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);
....
}
为什么呢?它会产生运行时错误吗?
答案 0 :(得分:8)
gcc和clang以及其他可能visual C++,但支持variable length arrays扩展,即使它是 C99 功能而不是C ++特性。
在gcc
和clang
中,如果您使用-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的选项。