obj-c header 中的 extern 是什么意思

What does extern mean in an obj-c header

这段代码是什么意思?

// myheader.h
extern const NSUInteger Something;

@interface MyObject : NSObject
...
@end

extern在这里是什么意思,can/will如何使用?它是 object 的一部分吗?它在项目中是全局的吗?它在哪里定义(在 header 中)重要吗?这是一个好习惯吗?

这是普通的 C。

What does extern mean here, and how can/will it be used?

extern const NSUInteger Something;

意思是:

  • 有一个名为 Something.

  • 的变量
  • 类型为NSUInteger.

  • 无法更改(const)

  • 不要创建该 var,而是 link 到可执行文件 (extern) 中包含的文件中其他地方的创建。

举个例子:

Exporter.h

extern const NSUInteger Something;

Exporter.m(或 Exporter.c,因为它是纯 C。)

#import "Exporter.h"
const NSUInteger Something = 5;        // This is the definition for the declaration above.

在 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.

每个进口商将分享 一个 变种。如果没有 extern 关键字,就会有不同的变量。

Is it part of the object?

没有。准确地说:声明了一个 ivar,如果它在 {} 中属于 @interface …@implementation …。这是在头文件中还是在 .m 文件中完成的没有任何意义。

Is it global in the project

它在您的可执行文件中是全局的。 (你称之为 "project" 不准确,但没关系。)

Does it matter where (in which header) is it defined?

没有。这在 C 中无关紧要。(编译器在解析导入和包含后看到文本。它不知道它来自哪里。)但是在一个翻译单元 (.m) 中,你必须有一个如上所示的定义 Exporter.m.

Is that a good practice?

extern var 声明的问题是每个导入 Exporter.h 的人都可以阅读并且 - 这很重要 - 更改该 var 而无需通知处理 Exporter.h 的软件的其他部分(和 Something)。所以几乎不可能控制数据流。

如今 extern 全局变量仅用于 const 变量,如您的 Q。该变量无法更改。所以没有问题,这是普遍接受的做法。