4

私が観察している状況に困惑しており、洞察が欲しいです。まず、LLVM 5 コンパイラ オプションをデフォルトに設定して、Xcode 5 を使用しています。

.m ファイルに次のような行があります。

static NSArray * const kSchemaVersions = @[@"1"];

そして、予想どおり、次のようなコンパイラ エラーが表示されます。Initializer element is not a compile-time constant.

ただし、この同じ行を.mm(Objective C++) ファイルに配置すると、コンパイラは文句を言いません。

なぜ機能しないのかは完全に理解していますが、なぜ機能するのかについては困惑しています。

考え?

4

1 に答える 1

7

おっしゃったように、C および Objective-C では、静的変数はコンパイル時の定数でのみ初期化できます。一方、C++ (したがって Objective-C++) では、静的変数は実行前の実行時に割り当てられますmain

詳細については、Eli Bendersky のNon-constant global initialization in C and C++ を参照してください。

于 2013-07-25T23:49:04.720 に答える