关于 Objective-C 项目中使用的 extern 的 3 个问题

2023-12-20

  1. 当我使用这个词时extern在方法或变量声明之前,我是否将其设置为全局的,从而在整个项目中可读/可写/可用?

  2. 如果我在关键字之前使用 extern,是否有可能我的项目的一部分仍然无法访问它?例如,仅通过子类..例如当我使用“受保护”时。

  3. extern是一个C关键字,对吗? Objective-C 中有类似的东西吗?我实际上不明白为什么他们在 Objective-C 项目中使用 C 关键字。

thanks


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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 Objective-C 项目中使用的 extern 的 3 个问题 的相关文章

随机推荐