1)您正在指定其链接。外部链接允许您或任何客户端引用该符号。
关于全局变量:如果变量是可变的和/或需要正确的构造,那么您应该考虑该对象的方法或函数。值得注意的例外是 NSString 常量:
// MONClass.h
extern NSString* const MONClassDidCompleteRenderNotification;
// MONClass.m
NSString* const MONClassDidCompleteRenderNotification = @"MONClassDidCompleteRenderNotification";
2)不存在extern关键字影响可见性的情况(public/protected/private/package)。要使用符号(例如常量或 C 函数),只需包含声明它的标头即可。
如果您是这门语言的新手,可能会有些困惑:在两者之间放置 extern C 声明(常量、函数)@interface ... @end
不会改变其范围:
@interface MONClass : NSObject
extern const size_t MaximumThreads;
@end
具有相同的范围(全局)和可见性(公共):
@interface MONClass : NSObject
@end
extern const size_t MaximumThreads;
所以将类相关的 C 常量或函数放在@interface...@end
and @implementation...@end
。我建议将它们放在与接口相同的标头中,外部@interface/@end
and @implementation/@end
并在名称前添加与其关联的类的前缀,如下所示:
@interface MONClass : NSObject
@end
extern const size_t MONClassMaximumThreads;
// MONClass.m
const size_t MONClassMaximumThreads = 23;
如果您希望该常量是私有的,只需像这样声明和定义它:
// MONClass.m
static const size_t MONClassMaximumThreads = 23;
@implementation MONClass
@end
不幸的是,没有同样简单或通用的方法来使用 objc 保护这个常量。
最后,如果数量因类而异,您还可以使用类方法:
@interface MONMammal : NSObject
+ (NSUInteger)numberOfLegs;
@end
@implementation MONDog
+ (NSUInteger)numberOfLegs { return 4; }
@end
@implementation MONHuman
+ (NSUInteger)numberOfLegs { return 2; }
@end
3)是的,还有其他语言。例如,如果您使用extern const int Something
在 C++ 翻译中,C++ 翻译将查找Something
声明为外部 C++ 符号。 objc 中没有替换; objc 是 C 的超集,继承了 C 的所有功能。用于extern
格式良好,您也可以在您使用的框架(例如 Foundation)中找到它。他们使用它是因为他们需要指定链接。 objc 不提供替代品,大概是因为它不需要更换或扩展。
为了避免这种情况,只需使用#define
像这样:
#if !defined(__cplusplus)
#define MONExternC extern
#else
#define MONExternC extern "C"
#endif
MONExternC const size_t MONClassMaximumThreads;