2012-08-17 2 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 

Ich kann i in der Schnittstelle erklären und es in der Durchführung ohne irgendwelche Fehler verwenden. Aber ich kann keine Variable vom Typ extern in der Schnittstelle deklarieren. Warum ist das so? Warum erhalte ich einen Fehler, der besagt, dass "Typname keine Angabe der Speicherklasse erlaubt"?type name lässt nicht zu, dass speicherklasse angegeben werden kann

Antwort

13

Kurzbeschreibung: Der eingeklammerte Abschnitt einer Klasse @interface OR @implementation ist nur für erklärt Instanzvariablen (auch bekannt als "Ivar"). Das Schlüsselwort extern dient nur zur Verwendung mit globalen Variablendeklarationen (oder Funktionen, aber das ist ein anderes Thema.)
Daher können Sie kein extern-ivar deklarieren.

Gritty Details: Variablen werden zuerst deklariert und dann definiert. Diese Unterscheidung ist in der Regel für Variablen in lokalen Bereichen unscharf, da eine lokal deklarierte Variable ohne explizite Definition häufig zugewiesen und vom Compiler mit einem Standardwert versehen wird.

Globale Variablen sind potenziell in jedem Bereich verfügbar, vorausgesetzt, der Bereich kennt die globale Existenz. Das ist, wo das Schlüsselwort extern hereinkommt - es erklärt, dass die globale Variable existiert und woanders definiert wurde. Dies ist nur nützlich, wenn Sie auf eine globale Variable in verschiedenen Codedateien zugreifen möchten.

Best Practices: Ihr Buch hat einige Code, der eine extern Variable in einer Implementierungsdatei (zB „.m“ Dateien usw.) Erklärt ... das kann funktionieren, aber es ist eine schlechte Praxis, weil du bist potentiell schlechte Annahmen darüber treffen, ob das Globale tatsächlich anderswo eine gültige Definition hat. (Aber komplizierte Compiler entdecken diesen Fehlertyp.)

Stattdessen empfiehlt es sich, eine externe Variable einmal in einer Headerdatei zu deklarieren, eine begleitende Implementierungsdatei zu haben, die die Externs in diesem Header definiert, und Fügen Sie dann diesen Header in andere Implementierungsdateien ein, die diese globale Variable verwenden möchten.

+0

Vielen Dank für Ihre Antwort, HachiEthan. Zufälligerweise hat das Buch, auf das ich mich beziehe, "extern" in der .m-Datei verwendet. –

+0

@Rut Ein wenig Nachforschungen, da ich noch nicht in das Wesentliche von extern gegraben habe! (Und es wird mir mit meiner aktuellen Arbeit helfen.) Wird die Antwort bald aktualisieren. =) – MechEthan

+0

Schätzen Sie es wirklich! –

Verwandte Themen