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

Puedo declarar i en la interfaz y usarlo en la implementación sin ningún error. Pero no puedo declarar una variable del tipo extern en la interfaz. ¿Por qué esto es tan? ¿Por qué recibo un error que dice que: "El nombre del tipo no permite que se especifique la clase de almacenamiento"?nombre de tipo no permite la clase de almacenamiento para ser especificado

Respuesta

13

Descripción breve: La sección entre corchetes de de @interface O @implementation es sólo para declarando variables de instancia (también conocido como "Ivar") una clase. La palabra clave extern solo se puede usar con declaraciones de variables globales (o funciones, pero ese es otro tema)
Por lo tanto, no puede declarar un ivar externo.

Granito Detalles: Las variables se declaran primero, y luego se definen. Esta distinción suele ser borrosa para las variables en los ámbitos locales, ya que una variable declarada localmente sin una definición explícita a menudo se asignará y el compilador le asignará un valor predeterminado.

Las variables globales están potencialmente disponibles en cualquier ámbito, siempre que el alcance sepa que el global existe. Ahí es donde entra la palabra clave extern - declara que existe la variable global, y fue definido en otro lugar. Esto solo es útil cuando quiere acceder a una variable global en diferentes archivos de código.

mejores prácticas: Su libro tiene un código que declara una variable extern en un archivo de aplicación (por ejemplo, archivos ".m", etc.) ... que puede funcionar, pero es una mala práctica porque eres haciendo suposiciones potencialmente malas sobre si ese global en realidad tiene una definición válida en otro lugar. (Pero, los compiladores sofisticados descubrirán este tipo de error.)

En su lugar, la mejor práctica es declarar una variable extern una vez en un archivo de encabezado, tener un archivo de implementación adjunto dedicado a definir los externos en ese encabezado, y luego incluya ese encabezado en otros archivos de implementación que quieran usar esa variable global.

+0

Gracias por su respuesta HachiEthan. Casualmente, el libro al que me refiero, ha usado 'extern' en el archivo '.m'. –

+0

@Rut Investigando un poco, ya que no he profundizado en lo esencial antes. (Y me ayudará con mi trabajo actual.) Actualizaré la respuesta pronto. =) – MechEthan

+0

Realmente lo aprecio HachiEthan! –

Cuestiones relacionadas