2017-11-13 10 views
2

スコープ/関数の中に入れたときに次のコードをコンパイルすることはできません。コンパイラは、initializer element is not constantの行に何かを示すエラーを生成します。これはGCCとMSVCで発生します。 コンパウンドリテラルで変数を初期化する

static const char *const *const list = (const char *const[]){"abc", "def", "xyz"}; 

しかし、コードは静的記憶域期間を持つグローバル変数として任意の関数の外に置かれ、 listが初期化されると、コードは罰金コンパイルし、警告またはエラーを生成しません。 listが非静的である場合にのみ、スコープ/関数内で初期化することもできます。

cppreference docsから次の引用は、私の目を引いています

場合複合リテラルは、ファイルスコープと 自動記憶域期間に発生した場合、化合物リテラル評価するには、静的 記憶域期間を持つに無名のオブジェクトをコンパウンドリテラルは、ブロック スコープで発生します(この場合、オブジェクトの有効期間は、ブロックを囲む の終わりで終了します)。

これは、静的な記憶期間を持つローカル変数を複合リテラルで初期化することはできないと言うことはできますか?

答えて

1

静的記憶期間を持つオブジェクトは、定数式で初期化できます。複合リテラルは定数ではありません(実際はlvalueです)。コンパイルリテラルを使用して静的な保存期間を持つオブジェクトを初期化することはできません(ただし、GCCでは拡張機能として使用できます)。

関連する問題