当我在方法或变量声明之前使用单词
extern
时,我是否将其设为全局并因此在整个项目中可读/可写/可用?如果我在关键字前使用 extern,我的部分项目是否仍然无法访问它?例如,仅通过子类......例如当我使用“protected”时。
extern
是 C 关键字,对吗? Objective-C 中是否有等效项?我其实不明白他们为什么在 Objective-C 项目中使用 C 关键字。
谢谢
最佳答案
1) 您正在指定其链接。外部链接允许您或任何客户引用符号。
关于全局变量:如果变量是可变的和/或需要适当的构造,那么您应该考虑该对象的方法或函数。值得注意的异常(exception)是 NSString 常量:
// MONClass.h
extern NSString* const MONClassDidCompleteRenderNotification;
// MONClass.m
NSString* const MONClassDidCompleteRenderNotification = @"MONClassDidCompleteRenderNotification";
2)不存在extern关键字影响可见性的情况(public/protected/private/package)。要使用符号(例如常量或 C 函数),只需包含声明它的 header 。
如果您是该语言的新手,会有些困惑:将 extern C 声明(常量、函数)放在 @interface ... @end
之间不会改变其范围:
@interface MONClass : NSObject
extern const size_t MaximumThreads;
@end
具有与以下相同的范围(全局)和可见性(公共(public)):
@interface MONClass : NSObject
@end
extern const size_t MaximumThreads;
所以将与类相关的 C 常量或函数放在 @interface...@end
和 @implementation...@end
中确实没有意义。我建议将它们放在与接口(interface)相同的 header 中,在 @interface/@end
和 @implementation/@end
之外,并在名称前加上它关联的类前缀,像这样:
@interface MONClass : NSObject
@end
extern const size_t MONClassMaximumThreads;
// MONClass.m
const size_t MONClassMaximumThreads = 23;
如果您希望该常量是私有(private)的,只需像这样声明和定义它:
// 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) 是的,还有其他语言。例如,如果您在 C++ 翻译中使用 extern const int Something
,C++ 翻译将查找声明为 extern C++ 符号的 Something
。 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;
关于objective-c - 一个Objective-C项目中使用extern的3个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7330048/