私は C++ の初心者です。C++ の本を読んでいましたが、
const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal
コンパイル時に float 変数の宣言が無効であると表示されますが、それはなぜですか?
使用するとします
int i = 3;
float f[i];
できます。
最初の状況の問題点は何ですか?
ありがとう。
私は C++ の初心者です。C++ の本を読んでいましたが、
const int i[] = { 1, 2, 3, 4 };
float f[i[3]]; // Illegal
コンパイル時に float 変数の宣言が無効であると表示されますが、それはなぜですか?
使用するとします
int i = 3;
float f[i];
できます。
最初の状況の問題点は何ですか?
ありがとう。
したがって、配列にはコンパイル時に既知の境界が必要でありi[3]
、厳密に言えばコンパイル時に既知であるが、言語が設定した「コンパイル時に既知」の基準を満たさないため、最初の配列は違法です。
2番目も同じ理由で違法です。
ただし、GCC は C99 スタイルの実行時サイズの配列を C++ の拡張機能としてサポートしているため、どちらの場合も一般に GCC で受け入れられます。-pedantic
フラグを GCC に渡して文句を言わせます。
編集: C++標準用語は「整数定数式」であり、そのように修飾されるものは、標準のセクション5.19で詳細に説明されています。正確な規則は自明ではなく、C++11 には により修飾されるより広い範囲がありますconstexpr
が、C++98 では、合法的なもののリストはおおよそ次のとおりです。
const
定数式として宣言され、初期化された整数型の変数2 番目の例は機能せず、機能しないはずです。
i
定数でなければなりません。これは機能します
const int i = 3;
float f[i];
セバスチャンの答えを説明するだけです:
静的配列を作成する場合、コンパイラは、確保する必要があるスペースの量を認識している必要があります。つまり、配列のサイズはコンパイル時にわかっている必要があります。つまり、リテラルまたは定数でなければなりません。
const int SIZE = 3;
int arr[SIZE]; // ok
int arr[3]; // also ok
int size = 3;
int arr[size]; // Not OK
の値はsize
配列が作成されるまでに異なる可能性があるため、oompiler は配列用にどれだけのスペースを予約するかを知りません。として宣言するとconst
、値が変更されないことがわかり、適切な量のスペースを確保できます。
可変サイズの配列が必要な場合は、 を使用して動的に作成する必要があります (使用が終わったらnew
、必ず でクリーンアップしてください)。delete
C++ で実行時にのみ長さがわかっている配列の場合、std::vector<T>
. 組み込み配列の場合、コンパイル時にサイズがわかっている必要があります。これは C++11 にも当てはまりますが、はるかに古い C99 標準では既に動的スタック配列がサポートされています。Why doesn't C++ support dynamic arrays on the stack?の受け入れられた回答も参照してください。