Objective-C 中的全局变量 - extern 和 .m 文件顶部声明的差异

2024-01-24

我知道你可以使用“extern”在 Objective-C 中定义一个全局变量,但我刚刚意识到我在第一个方法之前在 .m 文件顶部声明的变量也意外地是全局的(这导致了一些问题)问题)。我将它们移至头文件的 @interface 部分,我认为这正确地将它们声明为仅存在于类中,这解决了我的一些问题,但我仍然有点困惑。

将变量声明为 extern 并将其放在 .m 文件的顶部有什么区别?或者这些会导致同样的结果吗?


extern 是一种明确声明的方式,为了可读性和编译时执行,您只是宣告这个变量在这里,实际上期望它是defined别处。如果您还尝试定义 extern 变量,编译器会告诉您方法的错误。这对于全局变量来说非常有用,可以防止名称冲突和多重定义,这两者都会导致链接器错误。然而,extern 关键字本身并不使该变量成为全局变量。

使变量成为全局变量的是其在文件中声明的位置。如果您要在类的头文件中的 @interface 之外声明一个变量,那么您将声明一个在类的所有实例以及 #imports 标头的任何人之间共享且可见的变量。如果您要(并且显然确实)在类的 .m 文件中的 @implementation 之外声明了一个变量,那么您还将声明一个在类的所有实例之间共享的变量,但对任何人来说都是不可见的。 #导入你的标题。

因此,使用变量声明的位置来确定范围。你只会define这些全局变量集中在一处。对于您发现的所有其他地方declare他们,在声明前加上 extern 前缀,以使代码可读,您的意图清晰,并确保您不会尝试再次定义它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective-C 中的全局变量 - extern 和 .m 文件顶部声明的差异 的相关文章