3 preguntas sobre extern utilizado en un proyecto Objective-C
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 ?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".
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
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;
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.
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"
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