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。该变量无法更改。所以没有问题,这是普遍接受的做法。
这段代码是什么意思?
// 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。该变量无法更改。所以没有问题,这是普遍接受的做法。