2012-08-17 13 views
7
@interface Foo : NSObject 

{ 
    extern int gGlobalVar; 
    int i; 
} 
-(void)setgGlobalVar:(int)val; 

@end 


@implementation Foo 

-(void)setgGlobalVar:(int)val 
{ 
    i = 5; 
    NSLog(@"i = %i", i); 
    gGlobalVar = val; 
} 

@end 

Mogę zadeklarować i w interfejsie i użyć go we wdrożeniu bez żadnych błędów. Ale nie mogę zadeklarować zmiennej typu extern w interfejsie. Dlaczego tak jest? Dlaczego pojawia się błąd, który mówi, że: "Nazwa typu nie pozwala na określenie klasy pamięci"?nazwa typu nie pozwala określić klasy pamięci

Odpowiedz

13

Krótki opis: w nawiasie odcinek klasą na @interface LUB @implementation jest tylko dla deklarując instancji zmiennych (aka "Ivar"). Słowo kluczowe extern służy tylko do deklaracji zmiennych globalnych (lub funkcji, ale jest to inny temat).
Dlatego nie można zadeklarować zewnętrznego ivar.

Gritty Szczegóły: Zmienne są najpierw zadeklarowane, a następnie zdefiniowane. To rozróżnienie jest zwykle niewyraźne dla zmiennych w zakresach lokalnych, ponieważ lokalnie zadeklarowana zmienna bez wyraźnej definicji będzie często przydzielana i nadawana przez kompilator domyślnej wartości.

Zmienne globalne są potencjalnie dostępne w dowolnym zakresie, pod warunkiem, że zakres wie, że globalny istnieje. W tym miejscu pojawia się słowo kluczowe extern - ono deklaruje, że zmienna globalna istnieje i w innym miejscu zdefiniowano zdefiniowaną jako. Jest to przydatne tylko wtedy, gdy chcesz uzyskać dostęp do zmiennej globalnej w różnych plikach kodu.

Best Practices: Twoja książka ma jakiś kod, który deklaruje extern zmienną w pliku realizacji (np pliki „.m”, itd.) ... że może pracować, ale to jest złą praktyką, ponieważ jesteś co potencjalnie złych założeń o tym, czy dany globalny rzeczywiście ma prawidłową definicję w innym miejscu. (Ale, fantazyjni kompilatorzy odkryją ten typ błędu.)

Zamiast tego, najlepszą praktyką jest deklarowanie zmiennej extern raz w pliku nagłówkowym, mieć dołączony plik implementacji, który jest dedykowany do definiowania elementów zewnętrznych w tym nagłówku, oraz następnie umieść ten nagłówek w innych plikach implementacji, które chcą użyć tej zmiennej globalnej.

+0

Dzięki za odpowiedź HachiEthan. Przypadkowo, książka, do której się odwołuję, używa "extern" w pliku ".m". –

+0

@Rut Robię małe badania, ponieważ nie zagłębiłem się w gęstwiny extern wcześniej! (I to pomoże mi w mojej obecnej pracy.) Niedługo zaktualizuje odpowiedź. =) – MechEthan

+0

Naprawdę doceniam to HachiEthan! –

Powiązane problemy