Objective c &引用;初始值设定项不是编译时常量;错误在.mm中起作用?

Objective c &引用;初始值设定项不是编译时常量;错误在.mm中起作用?,objective-c,objective-c++,Objective C,Objective C++,我对我观察到的情况感到困惑,希望能有一些见解。首先,我使用的是Xcode 5,LLVM 5编译器选项设置为默认值 我在.m文件中有一行,例如: static NSArray * const kSchemaVersions = @[@"1"]; 而且,正如预期的那样,我看到一个编译器错误,说初始值设定项元素不是编译时常量。 但是,如果我将这一行放在.mm(Objective C++)文件中,编译器不会抱怨 我完全理解为什么它不应该起作用,但我不明白为什么它看起来起作用 想法?正如您所提到的,在C

我对我观察到的情况感到困惑,希望能有一些见解。首先,我使用的是Xcode 5,LLVM 5编译器选项设置为默认值

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

static NSArray * const kSchemaVersions = @[@"1"];
而且,正如预期的那样,我看到一个编译器错误,说
初始值设定项元素不是编译时常量。

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

我完全理解为什么它不应该起作用,但我不明白为什么它看起来起作用


想法?

正如您所提到的,在C和Objective-C中,静态变量只能用编译时常量初始化。另一方面,在C++(因此Objul-C++)中,在运行时分配静态变量,在<代码>主< /COR>运行之前。
有关更多详细信息,请查看Eli Bendersky的

感谢您的回答和Eli博客的链接。我的清晰性来自于这篇文章:“在C++中,在用户的主函数运行之前,在运行时确定更多的内容。这是为了允许全局和静态对象的正确构建(C++对象可能有用户定义的构造函数,而C的构造函数不是这样的。)您所说的是类的静态字段。如果我们考虑函数内的静态变量,当函数被首次调用时,它们将被初始化,而不是在<代码>主< /代码>运行之前。