1) estás especificando su vinculación. El enlace externo 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 notable excepción 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 externa afecte la visibilidad (público/protegido/privado/paquete). para usar el símbolo (por ejemplo, la función constante o C), simplemente incluya el encabezado en el que se declara.
algo confuso si es nuevo en el lenguaje: colocar declaraciones C externas (constantes, funciones) en el medio @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;
por lo que realmente no tiene sentido colocar sus constantes o funciones C relacionadas con la clase en el @interface...@end
y @implementation...@end
. Recomiendo colocarlos en el mismo encabezado que la interfaz, fuera @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 desea que esa constante sea privada, simplemente declare y defínala así:
// MONClass.m
static const size_t MONClassMaximumThreads = 23;
@implementation MONClass
@end
desafortunadamente, no existe 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 según la 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 usas extern const int Something
en una traducción de C++, la traducción de C++ buscará Something
declarado como un símbolo C++ externo. no hay sustitución en objc; objc es un superconjunto de C y hereda todas las funcionalidades de C. uso de extern
está bien formado y también puede encontrarlo en los marcos que utiliza (por ejemplo, Foundation). lo usan porque necesitan especificar la vinculación. objc no ofrece un sustituto, presumiblemente porque no requirió un reemplazo o extensión.
para evitar esto, simplemente use un #define
Me gusta esto:
#if !defined(__cplusplus)
#define MONExternC extern
#else
#define MONExternC extern "C"
#endif
MONExternC const size_t MONClassMaximumThreads;
extern
no significa “global”, significa “definido en otro lugar”. Se usa para decirle al compilador que existe una variable o función (en otro archivo de objeto o biblioteca), para que no se queje y que el enlazador reciba ese archivo de objeto o biblioteca.
Como consecuencia extern
implica que el elemento de destino 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 una construcción de C que se defina de otra manera en Objective-C.
Punto 3: Sí, puede usar FOUNDATION_EXPORT en el objetivo C, que es una macro que se resuelve con una palabra clave diferente dependiendo de si compila C o C ++
Más información aquí sobre las diferencias: “FOUNDATION_EXPORT” vs “extern”
Objective-C es un superconjunto de C. Por lo tanto, se aplican las palabras clave de C.
– Estera
7 de septiembre de 2011 a las 7:07
@Mat Lo sé, pero mi punto era: ¿objetivo-c no proporciona sus propias palabras clave para declarar métodos y variables globales?
– aneurisma
7 de septiembre de 2011 a las 7:15
@Patrick: lo que quise decir es que “extern es la palabra clave C, ¿verdad? ¿Hay un equivalente en Objective C?” realmente no tiene sentido. El Objective-C equivalente a la C
extern
es…extern
. Ver también Uso de extern en Objective C (y las 4 o 5 preguntas principales relacionadas en esta página)– Estera
7 de septiembre de 2011 a las 7:18