4

C++入門書はそれを言います

配列の次元はコンパイル時に認識されている必要があります。つまり、次元は定数式である必要があります。

別のポイントは、

unsigned count = 42;           // not a constant expression
constexpr unsigned size = 42;  // a constant expression

私は、次の宣言が失敗することを期待します

a[count];                      // Is an error according to Primer

それでも、そうではありません。コンパイルして正常に実行します。

また、奇妙なこと++count;に、配列宣言の後も問題は発生しません。

-std=c++11フラグを付けてコンパイルされたプログラムg++4.71

何故ですか?

4

3 に答える 3

8

あなたのコードは実際には合法的なC++ではありません。一部のコンパイラでは、拡張として可変長配列を使用できますが、標準のC++ではありません。GCCにこれについて文句を言わせるには、を渡し-pedanticます。一般に、少なくとも次の警告フラグをGCCに渡す必要があります。

-W -Wall -Wextra -pedantic
于 2012-08-23T23:11:12.660 に答える
3

このリンクによると:http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html、GCCはC90モードおよびC++で可変長C配列をサポートします。これは標準のC++ではないため、これをコンパイラ拡張として扱い、移植性がないと想定する必要があります。

于 2012-08-23T22:58:57.927 に答える
1

他の回答はすでに解決策を提供しています。g++では、C ++の拡張機能として変数長配列(VLA)を使用できます(技術的には、VLAはC90のC機能です)。標準準拠のC++を使用していることを確認するには、パス-pedanticして警告を取得し、警告-pedantic -Werrorをハードエラーにします。

デバッグモードでコンパイルする場合は、次のことをお勧めします。

g ++ -std = c ++ 11 -O0 -g3 -pedantic -pedantic-errors -Wall -Wextra -Werror -Wconversion

O0最適化フラグであり、デバッグ-g3に使用されます。最適化を使用し、デバッグが不要な場合は、これらを変更する必要があります。ただし、サードパーティのライブラリを使用している場合など、特定の理由でコードを変更できない場合があるため、削除が必要になる場合があります。それぞれが行うことの説明については、ここを参照してください-Werror -Wconversion

于 2012-08-23T23:47:48.263 に答える