Objective-C错误:初始值设定项元素不是常量

Objective-C错误:初始值设定项元素不是常量,objective-c,Objective C,为什么编译器在提供的代码上给我以下错误消息:“initializer元素不是常量”。相应的C/C++代码可以在gcc下完美编译 #import <Foundation/Foundation.h> const float a = 1; const float b = a + a; // <- error here int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAuto

为什么编译器在提供的代码上给我以下错误消息:“initializer元素不是常量”。相应的C/C++代码可以在gcc下完美编译

#import <Foundation/Foundation.h>

const float a = 1;
const float b = a + a; // <- error here

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    NSLog(@"Hello, World!");
    [pool drain];
    return 0;
}
#导入
常数浮点a=1;

常量浮点b=a+a;// 只有当
const float
语句出现在文件范围以外的地方时,该代码才会正确编译

显然,这是标准的一部分。必须使用常量表达式初始化所有文件范围声明的变量,而不是使用包含常量变量的表达式


您正在使用另一个对象的值初始化浮点“b”。任何对象的值,即使是常量限定值,在C中也不是常量表达式。

我的机器上没有Xcode,所以我不能尝试我的示例

但是你能试试吗

#define A (1) 
#define B (A + A)

const float a = A;
const float b = B;
@dreamlax是正确的,您不能拥有其初始化依赖于另一个(const)变量的const声明。如果需要一个变量依赖于另一个变量,我建议创建一个变量,可以将其视为常量并只初始化一次。有关详细信息,请参见以下问题:


您知道Objective-c也是在gcc下编译的吗?您可以删除所有Objective-c内容并将其编译为c,您会得到相同的错误。但是您也可以删除所有Objective-c内容,保存到main.c文件并使用gcc main.c编译,它将按预期工作。(至少对我有效)你能解释一下原因吗?谢谢,我很高兴interested@hhafez-在这种情况下,“b”不是用另一个对象初始化的,而是用另一个原语初始化的。但是,它们都被声明为“const”,而“b”取决于“a”的值,这在标准中是非法的。您能解释一下“只有当const float语句出现在文件范围以外的地方时,才会正确编译”这一部分吗?这意味着什么?你的第二个解决方案会给出同样的错误。。。你不能只是强制转换一个变量使其成为文字。删除了我的第二个解决方案(只剩下第一个)请注意#define表达式是“预处理器指令”,这意味着它们会在编译器破解之前在代码中被替换。如果这确实有效,那是因为在编译时得到了“常量浮点a=(1);”和“常量浮点b=((1)+(1));”。总的来说是毫无意义的。