这段代码是什么意思?
// myheader.h
extern const NSUInteger Something;
@interface MyObject : NSObject
...
@end
extern在这里意味着什么,以及它将如何/将被使用?它是对象的一部分吗?它在项目中是全球性的吗?它定义在何处(在哪个标题中)是否重要?这是一个好习惯吗?
答案 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.那些变量无法改变。所以没有问题,这是普遍接受的做法。