【问题标题】:When should my const be static in Objective-C?什么时候我的 const 在 Objective-C 中应该是静态的?
【发布时间】:2014-05-28 22:12:45
【问题描述】:

在我的 .m 文件的顶部,我通常有一个 const int varWidth = 42; 或类似的东西。如果我想公开,我会在我的 .h 中添加 extern const int varWidth

但是,在阅读 this link 之后,如果仅在 .m 文件中使用(但如果不是公开的),显然建议在前面添加 static。这是为什么呢?

我理解静态意味着它只会被初始化一次,并且它的值将在程序的完整执行过程中持续存在,但我不明白如果它是一个 const 有多么重要。

【问题讨论】:

  • static 在函数级别范围内成为生命周期限定符。顶级范围内的static 表示内部链接。

标签: objective-c c


【解决方案1】:

在 C 和相关语言中(Objective C 就是其中之一),静态存储类说明符主要用于信息隐藏

当您在变量声明前添加 static 关键字时,您使用内部链接对其进行标记。内部链接意味着多个标识符指代不同的事物,即使它们出现在不同的翻译单元中(在 C 中,翻译单元是经过 C 预处理器处理后的源文件)。换句话说,具有内部链接的标识符只能从它被声明的翻译单元中看到。

当您不希望其他翻译单元中的实体了解源文件中的特定标识符时,您应该使用它。当您的常量没有很多实体时,您可以随意更改它,同时尽量减少对程序的影响。

【讨论】:

  • 我认为您对内部链接的描述与您的意思相反。具有内部链接的标识符将引用不同翻译单元中的不同事物。
【解决方案2】:

对于顶级作用域中的变量,static 表示该变量具有内部链接。因此,两个声明同名静态变量的文件将各自拥有自己的变量,而不是相互冲突。

【讨论】:

  • 因此,如果我有两个具有顶级变量但没有静态的类,它们就会发生冲突。怎么样?
  • @DougSmith:嗯,同一个全局变量会有多个定义。 C 不允许这样做,因此您将得到错误或未定义的行为。
【解决方案3】:

Objective-C 是 C 的超集,因此 static 全局变量的含义与 C 中的相同。在 C 中,static 使全局变量仅在声明它的文件中可见。 你可以在这里读更多关于它的内容: What does “static” mean in a C program?

【讨论】:

  • @DougSmith:您不导入变量。 #import 是一个编译器指令,它将文本从命名文件复制到出现#import 的位置。如果您导入包含静态变量声明的文件,您只需创建另一个静态变量声明来代替 #import
猜你喜欢
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2016-02-15
  • 2010-12-30
  • 2012-09-15
相关资源
最近更新 更多