在我的代码(游戏引擎代码(中有多个源(.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
限定符中的变量。