2009-01-19 64 views
10

爲什麼編譯器在提供的代碼上給我提供以下錯誤消息:「初始化程序元素不是常量」。相應的C/C++代碼在gcc下完美編譯。Objective-C錯誤:初始化程序元素不是常量

#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; 
} 
+0

你知道的Objective-C是根據GCC編譯呢? – hhafez 2009-01-19 23:22:42

+0

您可以刪除所有Objective-C的東西,並將其編譯爲C,並得到相同的錯誤。 – Chuck 2009-01-20 00:17:53

+2

但是你也可以刪除所有Objective-C的東西,保存到main.c文件並使用gcc main.c進行編譯,它將按預期工作。 (至少它適用於我) – 2009-01-20 11:59:17

回答

12

如果const float語句出現在文件範圍以外的地方,那麼該代碼只能正確編譯。

這顯然是標準的一部分。重要的是所有文件範圍聲明的變量都用常量表達式初始化,而不是涉及常量變量的表達式。

您正在使用另一個對象的值初始化float'b'。任何對象的價值,即使它是一個const合格,是不是在C常量表達式

1

我沒有Xcode中我的機器在這裏,所以我不能盡我的例子,

但你可以嘗試

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

const float a = A; 
const float b = B; 
4

@dreamlax是正確的,你不能有一個const聲明其初始化取決於另一個(常量)變量。如果你需要依靠另一個,我建議創建一個變量,你可以把它當作一個常量,並只初始化一次。詳情請參閱這些所謂的問題: