【问题标题】:What does extern mean in an obj-c header [duplicate]obj-c标头中的extern是什么意思[重复]
【发布时间】:2015-01-21 15:14:02
【问题描述】:

这段代码是什么意思?

// myheader.h
extern const NSUInteger Something;

@interface MyObject : NSObject
...
@end

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

【问题讨论】:

    标签: objective-c extern


    【解决方案1】:

    这是普通的 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 中一样。无法更改变量。所以没有问题,这是普遍接受的做法。

    【讨论】:

    • 感谢您的详尽回答
    猜你喜欢
    • 2014-01-31
    • 2017-02-17
    • 2011-01-22
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多