"初始化程序不是编译时常量"错误在.mm中有效吗?

lev*_*ker 4 objective-c objective-c++

我对自己正在观察的情况感到困惑,并且会喜欢一些见解.首先,我使用Xcode 5,将LLVM 5编译器选项设置为默认值.

我在.m文件中有一行,例如:

static NSArray * const kSchemaVersions = @[@"1"];
Run Code Online (Sandbox Code Playgroud)

并且,正如预期的那样,我看到编译器错误说 Initializer element is not a compile-time constant.

但是,如果我将同一行放在.mm(Objective C++)文件中,编译器不会抱怨.

我完全明白为什么它不起作用,但我很困惑为什么它似乎.

思考?

Seb*_*ian 7

如前所述,在C和Objective-C中,静态变量只能用编译时常量初始化.另一方面,在C++(以及Objective-C++)中,静态变量在运行之前在运行时分配main.

有关更多详细信息,请参阅Eli Bendersky 在C和C++中非常量全局初始化