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

时间:2015-01-21 15:14:02

标签: objective-c extern

这段代码是什么意思?

// myheader.h
extern const NSUInteger Something;

@interface MyObject : NSObject
...
@end

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

1 个答案:

答案 0 :(得分:5)

这是简单的C.

  

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

extern const NSUInteger Something;

这意味着:

  • 有一个名为Something的var。

  • 它的类型为NSUInteger

  • 无法更改(const

  • 不要创建该var,而是链接到可执行文件中包含的文件中的其他位置的创建(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.

每个导入者都将共享一个 var。如果没有extern关键字,则会有不同的变量。

  

它是对象的一部分吗?

没有。确切地说:如果ivar属于{ ... },属于@interface …@implementation …,则声明为ivar。无论是在标题中还是在.m文件中完成,都没有任何意义。

  

项目中是全球性的

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

  

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

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

所示
  

这是一个好习惯吗?

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

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