在我的代码(游戏引擎代码)中,有多个源文件(.c)来维护游戏的状态,状态如
START
CONFIGURE
STOP
END
DEFAULT
RUNNING
维持状态,一个全局变量 gameStatus
在多个源文件之间共享,使用 extern
现在我读到全局变量不好用,它允许外部模块改变它,而且随着使用全局变量的组件数量增加,交互的复杂性也会增加。
所以我把这个变量的范围限制在一个文件中,用 static
关键字,并增加了像 get or set APIs
在同一个文件中。所以其他文件只能通过访问器API来访问该变量。
我已经删除了全局变量,这是很好的,但现在每个使用全局变量的文件都必须调用访问API,这似乎增加了函数调用的开销。
所以现在我很困惑,到底哪种方式更好呢?有什么C语言的标准可以告诉我如何有效地在不同的源文件之间共享数据吗?
全局变量是 "不好的做法 "完全是见仁见智,100%取决于上下文。如果不看你的代码,是不可能说你是否在应用这种 "坏做法 "的。全局变量不是坏做法 本身,用错误的方式使用它们是。在C语言中,全局变量往往是必要的,以C标准库为例。errno
是一个全局变量,在库代码和用户代码中基本上到处都在使用,用来检查错误。这种做法不好吗?他们能否定义一个函数 get_errno()
而不是(好吧,说实话,他们实际上是这样做的,只是隐藏了......但那是出于复杂的并发原因)?我让你来决定。
在你的具体案例中,将一个全局可见的变量改为 static
然后创建两个函数来获取和设置它的值是完全没有必要的。代码的任何部分仍然可以修改变量,但现在这样做只是比较麻烦,而且如果优化不当,还可能导致代码更慢。总而言之,通过创建这些函数,你只是把变量的 static
定语。