C 標準では静的データの初期化が制限されていますクラス定義内のメンバーを静的定数整数または列挙のみに変換type.
class A { static const int a = 3; // Allowed static int b = 3; // Error: Non-const static member cannot be initialized in class definition static const int c[2] = {1, 2}; // Allowed static int d[2] = {1, 2}; // Error: Non-const static array cannot be initialized in class definition };
この制限は、コンパイラによる静的データ メンバーの処理方法によるものです。すべての静的データ メンバーは一意の定義を持つ必要があり、クラス定義で初期化されると、クラスが複数の翻訳単位に含まれるときに複数の定義が作成されます。
静的配列、定数配列であっても、そのサイズはコンパイル時に決定できないため、クラス定義で初期化できません。コンパイラは、配列にメモリを割り当てる前に、配列のサイズを知る必要があります。
クラス定義で静的配列を初期化するには、 「列挙トリック」を使用できます:
class A { static const int a = 3; enum { arrSize = 2 }; static const int c[arrSize] = {1, 2}; };
非定数静的メンバーの初期化に対する標準の制限は、あいまいな定義を防止し、翻訳単位全体で一意のメンバー定義を保証する必要があることから生じています。
静的配列に関しては、C 言語の設計が採用されています。はコンパイル時の効率を優先しており、メモリ割り当てを最適化するためにコンパイル時に配列サイズを把握する必要があります。ただし、C 11 では定数式の概念が導入され、コンパイル時に決定される値で const データ メンバーを初期化できるため、将来の C バージョンではより柔軟な対応が可能になる可能性があります。
以上がC クラス定義内で非 Const 静的メンバーと配列を初期化できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。