コードで、
const double rotationStep = 0.001;
const int N = 2*int(M_PI/rotationStep) + 3;
static unsigned int counts[N];
g++
エラーが発生します:
バインドされた配列は、»]« トークンの前の整数定数ではありません
g++
/gcc
バージョン 4.6.1を使用しています
なぜg++
その表現について文句を言うのか誰か教えてもらえますか?
2003 年の ISO C++ 標準の時点では、これは整数の定数式ではありません。標準のセクション 5.19 を引用します。
整数定数式には、リテラル (2.13)、定数式 (8.5) で初期化された整数型または列挙型の列挙子、変数
const
または静的データ メンバー、整数型または列挙型の非型テンプレート パラメーター、およびsizeof
式のみを含めることができます。浮動リテラル (2.13.3) は、整数型または列挙型にキャストされている場合にのみ表示できます。
これを変更できます:
const double rotationStep = 0.001;
const int N = 2*int(M_PI/rotationStep) + 3;
これに:
const int inverseRotationStep = 1000;
const int N = 2*int(M_PI)*inverseRotationStep + 3;
(それはどこかで定義されていることを前提としM_PI
ています。標準では指定されていませんが、一般的な拡張機能です。)
2011 ISO C++ 標準では、これが少し緩和されています。5.19p3 (N3337 ドラフトを引用) は次のように述べています。
整数定数式は、整数型またはスコープなし列挙型のリテラル定数式です。
、したがっては新しい規則に適合すると思います が、コンパイラがまだそれらを実装していない可能性があります。2*int(M_PI/rotationStep) + 3
N
問題はそれです...
g++ gives: array bound is not an integer constant before »]« token
const
値は定数式ではありません (ただし、これが混乱する理由は理解できます) 。
編集:これを最初に読んだとき、私はCを想定していました。ここでの問題は、この式がコンパイル時に評価されていないことです。
const int N = 2*int(M_PI/rotationStep) + 3;
これは
const int N = 10;
コメントで@ildjarnが指摘したように、浮動小数点演算はコンパイル時に評価されるとは限りません。 これは私が見つけた関連するSO投稿です。
Ed がすでに指摘したように、定数の折りたたみを含む浮動小数点演算の最適化は、コンパイル時に行われるとは限りません。この件に関するIntel のページにはいくつかの例が示されていますが、主に、丸めの動作が異なる可能性があり、浮動小数点演算が例外をスローする可能性があるということです。このペーパーでは、もう少し詳しく説明します (セクション 8.3、「算術簡約」)。
GCC はサポートのみ
「ターゲットがそれらをネイティブにサポートしている場合、融合された乗加算演算の形成などの浮動小数点式の縮小」
コンパイラー最適化マニュアルの ffp-contract フラグの説明に記載されているとおりです。