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

gccclangの両方、および場合によってはビジュアル C++ではありませんが、C++ の機能ではなくC99の機能であるにもかかわらず、可変長配列を拡張としてサポートします。

両方gccclangコンパイルすると-pedantic、拡張機能を使用していることを警告します。たとえばgcc、次のような警告が表示されます。

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

を使用-pedantic-errorsして、警告をエラーに変えることができます。

私が理解している限り、C++14は可変長配列をサポートしている可能性があります。C99 ドラフトの標準セクション6.7.5.2 Array declaratorsには、次のように記載されています。

[...] サイズが整数定数式で、要素の型に既知の定数サイズがある場合、配列型は可変長配列型ではありません。それ以外の場合、配列タイプは可変長配列タイプです。

C++ ドラフト標準では定数が必要ですが、セクション8.3.4 配列のドラフト C++ 標準では次のように述べられています。

宣言 TD で、D の形式は次のとおりです。

D1 [定数式opt] 属性指定子seqopt

[..] 定数式 (5.19) が存在する場合、それは型 std::size_t の変換された定数式であり、その値は 0 より大きくなければなりません。[...]

于 2013-11-04T19:58:22.910 に答える
2

一部の C++ コンパイラには、C++ で C VLA を使用できるようにするオプションがあります。

于 2013-11-04T19:59:06.027 に答える