3 preguntas sobre extern utilizado en un proyecto Objective-C


  1. Cuando uso la palabra extern antes de una declaración de método o variable, ¿la estoy haciendo global y, por lo tanto, legible/escribible/utilizable durante todo el proyecto ?

  2. Si utilizo extern antes de una palabra clave, ¿hay alguna posibilidad de que todavía no sea accesible por parte de mi proyecto ? Por ejemplo, solo por subclases.. como cuando uso "protegido".

  3. extern es una palabra clave C, ¿verdad? Hay un equivalente en Objective-C? En realidad no entiendo por qué usan una C palabra clave en un proyecto de Objective-C.

Gracias

Author: rounak, 2011-09-07

3 answers

1) está especificando su enlace. extern linkage le permite a usted o a cualquier cliente hacer referencia al símbolo.

Con respecto a las variables globales: si la variable es mutable y/o necesita una construcción adecuada, entonces debe considerar métodos o funciones para este objeto. la excepción notable a esto son las constantes NSString:

// MONClass.h
extern NSString* const MONClassDidCompleteRenderNotification;
// MONClass.m
NSString* const MONClassDidCompleteRenderNotification = @"MONClassDidCompleteRenderNotification";

2) no hay ningún caso en el que la palabra clave extern afecte a la visibilidad (público/protegido/privado/paquete). para usar el símbolo (por ejemplo, la constante o la función C), simplemente incluya el encabezado en el que se declara.

Algo confuso si eres nuevo en el lenguaje: colocar declaraciones C externas (constantes, funciones) entre @interface ... @end no alterará su alcance:

@interface MONClass : NSObject

extern const size_t MaximumThreads;

@end

Tiene el mismo alcance (global) y visibilidad (pública) que:

@interface MONClass : NSObject

@end

extern const size_t MaximumThreads;

Así que realmente no tiene sentido colocar las constantes o funciones de C relacionadas con su clase en @interface...@end y @implementation...@end. recomiendo colocar estos en el mismo encabezado que la interfaz, fuera de @interface/@end y @implementation/@end y prefijando el nombre con la clase a la que está asociado, así:

@interface MONClass : NSObject

@end

extern const size_t MONClassMaximumThreads;
// MONClass.m
const size_t MONClassMaximumThreads = 23;

Y si quieres que esa constante sea privada, simplemente declara y define así:{[17]]}

// MONClass.m
static const size_t MONClassMaximumThreads = 23;

@implementation MONClass

@end

Desafortunadamente, no hay una forma igualmente simple o común de hacer que esta constante esté protegida con objc.

Finalmente, también puede usar métodos de clase si el número debe variar por clase:

@interface MONMammal : NSObject
+ (NSUInteger)numberOfLegs;
@end

@implementation MONDog
+ (NSUInteger)numberOfLegs { return 4; }
@end
@implementation MONHuman
+ (NSUInteger)numberOfLegs { return 2; }
@end

3) sí, entre otros idiomas. por ejemplo, si utiliza extern const int Something en una traducción de c++, el c++ la traducción buscará Something declarado como símbolo C++ externo. no hay sustitución en objc; objc es un superconjunto de C y hereda todas las funcionalidades de C. el uso de extern está bien formado y también lo puedes encontrar en los frameworks que usas (por ejemplo, Foundation). lo utilizan porque necesitan especificar la vinculación. objc no ofrece un sustituto, presumiblemente porque no requirió un reemplazo o prórroga.

Para evitar esto, simplemente use un #define como este:

#if !defined(__cplusplus)
#define MONExternC extern
#else
#define MONExternC extern "C"
#endif

MONExternC const size_t MONClassMaximumThreads;
 38
Author: justin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-07 21:11:33

extern no significa "global", significa"definido en otra parte". Se usa para decirle al compilador que existe una variable o función (en otro archivo objeto o biblioteca), para que no se queje de ello y que el enlazador se proporcionará con ese archivo objeto o biblioteca.

Como consecuencia, extern implica que el elemento objetivo es global.

Objective-C es solo un superconjunto de C. Todo lo que está disponible en C también está disponible en Objective-C, con la misma sintaxis y semántica. No hay construcción de C que se defina de otra manera en Objective-C.

 17
Author: mouviciel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-07 07:21:34

Punto 3: Sí, puede usar FOUNDATION_EXPORT en objective C, que es una macro que resuelve diferentes palabras clave dependiendo de si compila C o C++

Más información aquí sobre las diferencias: "FOUNDATION_EXPORT" vs "extern"

 0
Author: Vlad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:00:04