global
次のように2次元配列を宣言しようとするとC++
:
int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];
エラーが発生しますerror: variable-size type declared outside of any function
global
次のように2次元配列を宣言しようとするとC++
:
int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];
エラーが発生しますerror: variable-size type declared outside of any function
(一見すると、「CとC ++の質問の違い」のように見えましたが、誤解される可能性があります。)
配列サイズとして非定数値を使用したため、可変長配列(VLA)を宣言しようとしています。C ++はVLAをまったくサポートしていませんが、CはローカルVLAのみをサポートしています。後者は、まさにコンパイラがそのエラーメッセージであなたに言っていることです。(C ++コンパイラではまったく異なるエラーが発生するため、このエラーメッセージはCコンパイラからのものだと思います。)
したがって、厳密に言えば、CでもC++でもそのような配列を宣言することはできません。C言語はVLAをサポートしていますが、それでもローカルである必要があります。Cで静的ストレージ期間のVLAを宣言することは許可されていません。
C ++では、すべての配列のコンパイル時サイズが事前に決定されている必要があります。つまり、配列サイズはコンパイル時定数で指定する必要があります。代わりに非定数値を使用したため、エラーが発生しました。
つまり、CとC ++の両方で、静的ストレージ期間のある配列(いわゆる「グローバル」配列を含む)のサイズを指定するときに定数式を使用する必要があります。
C ++では、サイズを一定にするために、次のように宣言する必要があります。const
const int maxX = 10;
const int maxZ = 10;
Cでは、オブジェクトは定数式const
を形成しないという意味で実際には定数ではないため、これは機能しません。Cでは、どちらかを使用する必要があります
#define maxX 10
#define maxZ 10
また
enum {
maxX = 10,
maxZ = 10
};
C++ では、変数を使用して配列のサイズを定義することはできません。これは、配列のメモリを割り当てる場所と必要なメモリ量をコンパイラがコンパイル時に知る必要があるためです。maxX
and maxZ
asを宣言int
すると変数になるため、配列の次元には適していません。ただし、それらを として宣言するconst int
と定数になり、コンパイラはこれらの値がプログラムの実行中に固定されることを認識し、それらを使用して配列の次元を定義できるようにします。
したがって、これは機能しません。
int maxX = 10;
int maxZ = 10;
SDL_Rect mapX[maxX][maxZ]; // Not allowed
しかし、これは問題ありません:
const int maxX = 10;
const int maxZ = 10;
SDL_Rect mapX[maxX][maxZ]; // Allowed
static const int maxX = 10;
static const int maxZ = 10;
SDL_Rect mapX[maxX][maxZ];
私にとってはうまくいきます。
一般に、グローバル、生の配列、またはグローバルな生の配列のいずれかを使用することは、一般的には良い習慣ではありません。明らかに、ここでの選択が正しいかどうかについてコメントするのに十分なコンテキストがありません。
現代の constness の前#define
は、この状況で正しく機能させるために、列挙または定数のいずれかを使用するのが一般的でした。
これが SDL_rect の正しい使い方だとは思いません。
構文は次のようになります
SDL_Rect rect = {0,0,10,10}
したがって、次のことができます。
int maxX = 10;
int maxZ = 10;
SDL_Rect rect = {0,0,maxX,maxZ}
C スタイルの配列ではなく、次の使用をお勧めしますstd::vector
。
std::vector< std::vector<SDL_Rect> > mapX;