関数に次のコードがある場合、エラーは発生せず、問題なくコンパイルできますが、グローバルスコープに入れると、「サイズ0の配列を割り当てることができません」というエラーが発生します。他のいくつかのエラー。なぜこれが発生し、どうすればエラーを取り除くことができますか。私はグローバル変数のリスクを認識しています。これは単なるテストケースです。
int* intest[2];
intest[0] = new int;
関数に次のコードがある場合、エラーは発生せず、問題なくコンパイルできますが、グローバルスコープに入れると、「サイズ0の配列を割り当てることができません」というエラーが発生します。他のいくつかのエラー。なぜこれが発生し、どうすればエラーを取り除くことができますか。私はグローバル変数のリスクを認識しています。これは単なるテストケースです。
int* intest[2];
intest[0] = new int;
グローバルスコープでの宣言は許可されていますが、new演算子または割り当ての使用は許可されていません。したがって、グローバルスコープで宣言int * intest [2]が必要です(そしてすべてのコードがそれを認識します)が、C++では新しいものがメインコードのシーケンスにある必要があります。(おそらく、アプリのある種の起動機能で)。
編集:@phresnelで指摘されているように、このスコープではnew演算子を使用できますが、割り当ては使用できません(これは異常ですが、違法ではありません)。ただし、開始として使用される次の新しい演算子は機能します。
int *x[2]={new int,new int};
一般に、このようなグローバルバッファの使用は非常に推奨されておらず、アンチパターンと見なされます。使用を回避できる場合は、おそらく使用する必要があります。
int* intest[2];
ただし、ローカルスコープに配置することは有効です:
intest[0] = new int;
ではありません。
違いは、上のものが初期化ステートメント (変数の作成) であり、下のものが実行されたコード セグメントであることです。
「実行」する必要があるコードは、グローバル スコープで呼び出すことはできません。たとえば、グローバル スコープで関数を呼び出すことはできません。その関数はいつ呼び出されますか?
グローバル スコープで必要な変数をいくつでも作成できますが、グローバル変数の初期化時に呼び出されるコンストラクター以外からコードを実行することはできません。
次のようなコードを実行する場合:
intest[0] = new int;
メインまたは別の関数を介して実行する必要があります。そうしないと、プログラムはいつ実行するかわかりません。
AFAIK、グローバルスコープでは、置くことしか許可さdefine
れていませdeclaration
ん。一方intest[0] = new int;
、コンパイル中に c/c++ コンパイラが失敗するという割り当てです。