【发布时间】:2015-01-21 15:14:02
【问题描述】:
这段代码是什么意思?
// myheader.h
extern const NSUInteger Something;
@interface MyObject : NSObject
...
@end
extern 在这里是什么意思,如何/将如何使用?它是对象的一部分吗?它在项目中是全球性的吗?它在哪里(在哪个标题中)定义是否重要?这是一个好习惯吗?
【问题讨论】:
标签: objective-c extern
这段代码是什么意思?
// myheader.h
extern const NSUInteger Something;
@interface MyObject : NSObject
...
@end
extern 在这里是什么意思,如何/将如何使用?它是对象的一部分吗?它在项目中是全球性的吗?它在哪里(在哪个标题中)定义是否重要?这是一个好习惯吗?
【问题讨论】:
标签: objective-c extern
这是普通的 C。
extern 在这里是什么意思,如何/将如何使用?
extern const NSUInteger Something;
意思是:
有一个名为Something的变量。
它的类型为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 …。这是在头文件中还是在 .m 文件中完成的,没有任何意义。
在项目中是全局的
它在您的可执行文件中是全局的。 (你称那个“项目”并不精确,但没关系。)
定义在哪里(在哪个标头中)是否重要?
没有。这在 C 中无关紧要。(编译器在解析导入和包含后会看到文本。它不知道它来自哪里。)但是在一个翻译单元(“.m”)中,您必须有一个定义,如上面在 Exporter 中所示.m.
这是个好习惯吗?
extern var 声明的问题在于,导入 Exporter.h 的每个人都可以读取并且 - 这很重要 - 更改该 var 而无需通知处理 Exporter.h(和 Something)的软件的其他部分。所以控制数据流几乎是不可能的。
如今,extern 全局变量仅用于 const 变量,就像在您的 Q 中一样。无法更改变量。所以没有问题,这是普遍接受的做法。
【讨论】: