2009-01-19 16 views
10

Neden derleyici sağlanan kod bana aşağıdaki hata iletisini veriyor sabit değildir: "başlatıcı eleman sabit değildir". Karşılık gelen C/C++ kodu gcc altında mükemmel bir şekilde derlenir. const float ifadeleri dosya kapsamı dışında bir yerde görünüyorsaObjective-C hatası: başlatıcı elemanı

#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

o Objective-c yanı gcc altında derlenmektedir biliyoruz? – hhafez

+0

Tüm Objective-C nesnelerini kaldırabilir ve bunu C olarak derleyebilir ve aynı hatayı alabilirsiniz. – Chuck

+2

Ancak, tüm Objective-C öğelerini kaldırabilir, main.c dosyasına kaydedebilir ve gcc main.c ile derleyebilirsiniz ve beklendiği gibi çalışacaktır. (en azından benim için çalışıyor) –

cevap

12

Bu kod sadece doğru derlemek olacaktır.

Görünüşe göre standart bir parçasıdır. Tüm dosya kapsamı bildirilen değişkenlerin sabit değişkenler içeren ifadeler değil, sabit ifadelerle başlatılması önemlidir.

başka nesnenin değeri ile şamandıra 'b' başlatılıyor edilmektedir. Bir const nitelikli olsa bile herhangi bir nesnenin değeri, C. sabit bir ifade değildir

+0

nedenini açıklayabilir misiniz? İlgilendiğim için teşekkürler – hhafez

+2

@hhafez - Bu durumda 'b' başka bir nesneyle değil, başka bir ilkel ile başlatılır. Ancak, her ikisi de 'const' olarak bildirilir ve 'b' standart tarafından geçersiz olan 'a' değerine bağlıdır. –

+0

"Yapı float ifadeleri dosya kapsamından başka bir yerde görünürse, yalnızca doğru şekilde derlenecek" bölümünü açıklayabilir misiniz? Bu ne anlama geliyor? – Olie

1

benim örnek deneyemem yüzden burada benim makinede Xcode yok

Ama Eğer

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

const float a = A; 
const float b = B; 
+0

ikinci çözümünüz aynı hatayı verir ... sadece bir değişken yapmak için bir değişken atayamazsınız. –

+0

benim ikinci çözüm derleyici ona bir çatlak ulaşmadan önce onlar kodunda değiştirilir anlamına #define ifadeleri "önişlemci direktifleri" olduğunu unutmayın – hhafez

+3

(sadece ilk sol) silindi. Eğer bu işe yararsa, çünkü "const float a = (1);" ve "const float b = ((1) + (1));" derleme zamanında. Genel olarak oldukça anlamsız. –

4

@dreamlax doğrudur deneyebilirsiniz, kimin başlatma başka (const) değişken bağlıdır const beyanı olamaz. Diğerine güvenmek için birine ihtiyacınız varsa, bir sabit olarak ele alabileceğiniz ve sadece bir kez başlatabileceğiniz bir değişken oluşturmanızı öneririm. Ayrıntılar için bu çok sorular bakınız: