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

ane*_*yzm 24 c objective-c extern globals

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

  2. 如果我在关键字之前使用extern,那么我的项目的一部分仍然无法访问它吗?例如,仅由子类...例如当我使用"protected"时.

  3. extern是一个C关键字,对吗?Objective-C中是否有等价物?我实际上不明白为什么他们在Objective-C项目中使用C关键字.

谢谢

jus*_*tin 39

1)您正在指定其链接.extern链接允许您或任何客户端引用该符号.

关于全局变量:如果变量是可变的和/或需要适当的构造,那么您应该考虑该对象的方法或函数.值得注意的例外是NSString常量:

// MONClass.h
extern NSString* const MONClassDidCompleteRenderNotification;
// MONClass.m
NSString* const MONClassDidCompleteRenderNotification = @"MONClassDidCompleteRenderNotification";
Run Code Online (Sandbox Code Playgroud)

2)extern关键字不会影响可见性(public/protected/private/package).要使用符号(例如常量或C函数),只需包含声明它的头.

如果您不熟悉该语言会有些混乱:在其间放置extern C声明(常量,函数)@interface ... @end不会改变其范围:

@interface MONClass : NSObject

extern const size_t MaximumThreads;

@end
Run Code Online (Sandbox Code Playgroud)

具有相同的范围(全局)和可见性(公共):

@interface MONClass : NSObject

@end

extern const size_t MaximumThreads;
Run Code Online (Sandbox Code Playgroud)

因此,在@interface...@end和中放置与类相关的C常量或函数是没有意义的@implementation...@end.我建议将它们放在与界面相同的标题中,在外面@interface/@end,@implementation/@end并在名称前面添加与之关联的类,如下所示:

@interface MONClass : NSObject

@end

extern const size_t MONClassMaximumThreads;
// MONClass.m
const size_t MONClassMaximumThreads = 23;
Run Code Online (Sandbox Code Playgroud)

如果你希望那个常量是私有的,只需声明并定义它:

// MONClass.m
static const size_t MONClassMaximumThreads = 23;

@implementation MONClass

@end
Run Code Online (Sandbox Code Playgroud)

不幸的是,没有同样简单或常见的方法来使用objc保持这种不变.

最后,如果数字因类而异,您也可以使用类方法:

@interface MONMammal : NSObject
+ (NSUInteger)numberOfLegs;
@end

@implementation MONDog
+ (NSUInteger)numberOfLegs { return 4; }
@end
@implementation MONHuman
+ (NSUInteger)numberOfLegs { return 2; }
@end
Run Code Online (Sandbox Code Playgroud)

3)是的,还有其他语言.例如,如果您extern const int Something在c ++转换中使用,则c ++转换将查找Something声明为extern C++符号.objc中没有替代品; objc是C的超集,并且继承了C的所有功能.使用extern很好,你也可以在你使用的框架中找到它(例如,基金会).他们使用它是因为他们需要指定链接.objc不提供替代品,大概是因为它不需要更换或延期.

要避免这种情况,只需使用#define如下:

#if !defined(__cplusplus)
#define MONExternC extern
#else
#define MONExternC extern "C"
#endif

MONExternC const size_t MONClassMaximumThreads;
Run Code Online (Sandbox Code Playgroud)

  • 从类声明的角度来看几个注释:wrt 1),Objective-C中没有`extern`方法; wrt 2),与1)相关,它不适用于类层次结构. (2认同)

mou*_*iel 17

extern并不意味着"全球",它意味着"在其他地方定义".它用于告诉编译器存在变量或函数(在另一个目标文件或库中),因此它不应该抱怨它以及链接器将提供该目标文件或库.

结果extern意味着目标项是全局的.

Objective-C只是C的超集.C中可用的所有内容都可以在Objective-C中使用,具有相同的语法和语义.在Objective-C中没有以另一种方式定义的C构造.