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

Posso dichiarare i nell'interfaccia e utilizzarlo in esecuzione senza errori. Ma non posso dichiarare una variabile del tipo extern nell'interfaccia. Perché è così? Perché viene visualizzato un errore che dice: "Il nome del tipo non consente di specificare la classe di memoria"?non consente di specificare la classe di memoria

risposta

13

Breve descrizione: La sezione parentesi di di @interface O @implementation è solo per dichiarazione variabili di istanza (alias "IVAR") di una classe. La parola chiave extern può essere utilizzata solo con dichiarazioni di variabili globali (o funzioni, ma questo è un altro argomento).
Pertanto, non è possibile dichiarare un ivar esterno.

Gritty Dettagli: Le variabili vengono prima dichiarate e quindi definite. Questa distinzione è generalmente sfocata per le variabili negli ambiti locali, poiché una variabile dichiarata localmente senza una definizione esplicita verrà spesso allocata e assegnata al compilatore da un valore predefinito.

Le variabili globali sono potenzialmente disponibili in qualsiasi ambito, a condizione che sappia che il globale esiste. È qui che entra in gioco la parola chiave extern - dichiara che la variabile globale esiste ed era definita altrove. Questo è utile solo quando si desidera accedere a una variabile globale in diversi file di codice.

Best Practices: Il tuo libro ha un codice che dichiara una extern variabile in un file di implementazione (ad esempio ".m" file, ecc.) ... che può funzionare, ma si tratta di una cattiva pratica perché sei facendo ipotesi potenzialmente errate sul fatto che quella realtà globale abbia effettivamente una definizione valida altrove. (Ma i compilatori elaborati scopriranno questo tipo di errore)

Invece, la procedura migliore è dichiarare una variabile extern una volta in un file di intestazione, avere un file di implementazione che è dedicato alla definizione degli esterni in quell'intestazione, e quindi includi quell'intestazione in altri file di implementazione che vogliono usare quella variabile globale.

+0

Grazie per la vostra risposta HachiEthan. Per coincidenza, il libro a cui mi riferisco ha usato 'extern' nel file '.m'. –

+0

@Rut Fare una piccola ricerca, perché non ho scavato nel nocciolo di extern prima! (E mi aiuterà con il mio attuale lavoro.) Aggiornerà presto la risposta. =) – MechEthan

+0

Apprezzo davvero HachiEthan! –