我正在使用一些使用许多全局变量的旧代码。我完全意识到使用全局变量的许多缺点,所以我的问题不是是否应该使用全局变量。
在查看了大部分代码后,我注意到了两种模式,我正试图决定哪一种更糟糕以及为什么。
这两种模式的相似之处在于,全局变量是使用"extern"公开的。
这两种模式之间的主要区别是:
-
一些全局变量在头文件中是外部的/公开的,这些头文件位于使用#include 将包含在许多源文件中
-
其他全局变量直接在源文件本身中外部化/公开
你认为这两个中哪一个比另一个更糟糕?为什么?
你会认为他们同样糟糕吗?为什么?
1)尽可能隐藏。如果它们不需要可见,就不允许人们使用它们(通过提供声明)。
2) 如果不需要extern,请使用static,并尽可能隐藏。
你认为这两个中哪一个比另一个更糟糕?为什么?
第一;因为它对其他翻译来说是不必要的可见。第二种可能会导致链接器错误,但需要内部知识才能在另一个源/翻译中正确使用。链接器问题可以通过使其成为static
来解决(同样,如果它的声明对一个翻译可见)。
你会认为他们同样糟糕吗?为什么?
没有。如果你可以隐藏全局变量的实现并限制它们的访问,那么你就帮了你的代码库一个忙。
我倾向于将C头文件分为三类:public、private和protected(不要与C++关键字或相同名称混淆)。公共是指任何人都可以访问的东西。私有表示仅用于模块内部实现的所有内容(如果拆分为多个文件);这些在模块外永远看不见。受保护的是那些通常不希望被另一个模块访问,但由于某种原因需要访问的项目(此处可能发生模块耦合)。
对我来说,在C源文件中而不是头文件中外部的符号(如全局变量)违反了这些"规则",并被解释为代码气味。
希望这能有所帮助。