obj-c标题中extern的含义是什么

Nic*_*nto -2 objective-c extern

这段代码是什么意思?

// myheader.h
extern const NSUInteger Something;

@interface MyObject : NSObject
...
@end
Run Code Online (Sandbox Code Playgroud)

extern在这里意味着什么,以及它将如何/将被使用?它是对象的一部分吗?它在项目中是全球性的吗?它定义在何处(在哪个标题中)是否重要?这是一个好习惯吗?

Ami*_*wad 5

这很简单C.

extern在这里意味着什么,以及它将如何/将被使用?

extern const NSUInteger Something;
Run Code Online (Sandbox Code Playgroud)

它的意思是:

  • 有一个名称的var Something.

  • 它有类型NSUInteger.

  • 它不能改变(const)

  • 不要创建该var,而是链接到executable(extern)中包含的文件中的其他位置的创建.

我们举个例子:

Exporter.h

extern const NSUInteger Something;
Run Code Online (Sandbox Code Playgroud)

Exporter.m(或者Exporter.c,因为它是普通的C.)

#import "Exporter.h"
const NSUInteger Something = 5;        // This is the definition for the declaration above.
Run Code Online (Sandbox Code Playgroud)

在Exporter.m中定义var并在Exporter.h中声明它后,导入Header的每个人都可以使用它:

Importer.h或Importer.m(或者Importer.c,因为它是普通的C.)

#import "Exporter.h" (Or #include, since it is plain C.)

// Now the compiler knows that 
// there is a global readonly var called Something, 
// its type is int, and
// it is readonly.
Run Code Online (Sandbox Code Playgroud)

每个进口商将共享一个 var.没有extern关键字,会有不同的变量.

它是对象的一部分吗?

不.准确地说:如果它是在里面的{...... }属于一个@interface …或一个@implementation ….无论是在标头中还是在.m文件中完成,都没有任何意义.

它在项目中是全球性的

它是可执行文件中的全局.(你称那个"项目"不精确,但没关系.)

它定义在何处(在哪个标题中)是否重要?

不.在C中从不重要.(编译器在解析导入后看到文本并包含.它不知道它来自何处.)但是在一个翻译单元(".m")中你必须有一个如上所示的定义在Exporter.m.

这是一个好习惯吗?

externvar声明的问题是每个导入Exporter.h的人都可以阅读 - 这一点很重要 - 在没有任何通知的情况下更改该var,以及处理Exporter.h(和Something)的软件的其他部分.因此几乎不可能控制数据流.

如今,extern全球变量仅用于const变量,就像你的Q.那些变量无法改变.所以没有问题,这是普遍接受的做法.