objective-c - 一个Objective-C项目中使用extern的3个问题

标签 objective-c c extern global

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

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

  3. 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/

相关文章:

c - 为什么 CTRL-D 没有用这个程序发出 EOF 信号?

c++ - 依赖于实现和未定义的行为之间有什么区别吗?

c++ - 如何从 extern "C"函数访问类变量?

iphone - 动态本地化应用程序内部的 iOS 应用程序?

ios - 视觉 QuartzCore iOS

iphone - 如何在 xCode 4.2 中添加 Entitlement.plist

c++ - 使用-lopencv_videoio的Opencv编译不起作用

iphone - 有没有一个非常简单的指南在新的 Xcode4 项目中安装 Three20 库?

c++ - C++ 中 extern const char* 的行为

c++ - const 对象的代码大小