C 我真的需要访问器函数从另一个文件访问全局变量吗?

C 我真的需要访问器函数从另一个文件访问全局变量吗?,c,global-variables,extern,C,Global Variables,Extern,在我的代码游戏引擎代码中有多个源.c文件,它们维护游戏的状态,如 START CONFIGURE STOP END DEFAULT RUNNING 为了维护状态,使用一个全局变量gameStatus,该变量使用extern关键字在多个源文件之间共享。现在我已经读到全局变量不好用,它允许外部模块更改它,并且随着使用全局变量的组件数量的增加,交互的复杂性也会增加 因此,我使用static关键字将变量的作用域限制为一个文件,并在同一个文件中添加了访问器方法,如get或set api。所以其他文件只能

在我的代码游戏引擎代码中有多个源.c文件,它们维护游戏的状态,如

START
CONFIGURE
STOP
END
DEFAULT
RUNNING
为了维护状态,使用一个全局变量gameStatus,该变量使用extern关键字在多个源文件之间共享。现在我已经读到全局变量不好用,它允许外部模块更改它,并且随着使用全局变量的组件数量的增加,交互的复杂性也会增加

因此,我使用static关键字将变量的作用域限制为一个文件,并在同一个文件中添加了访问器方法,如get或set api。所以其他文件只能使用访问器API访问该变量

我删除了一个很好的全局变量,但是现在使用该全局变量的所有其他文件都必须调用访问器API,这似乎增加了函数调用的开销


所以现在我很困惑哪一个更好?关于如何在不同的源文件之间高效地共享数据的任何C标准?

全局变量是不好的做法这一事实完全是基于观点的,100%取决于上下文。如果不查看代码,就无法判断是否应用了这种糟糕的做法。全局变量本身并不是坏的做法,以错误的方式使用它们是错误的。全局变量在C中经常是必需的。以C标准库为例:errno是一个全局变量,基本上在库代码和用户代码中的任何地方都使用它来检查错误。那是坏习惯吗?他们能定义一个函数get_errno吗?老实说,他们真的定义了,只是隐藏了。。。但这是因为复杂的并发原因?我让你决定


在您的特定情况下,将全局可见变量更改为static,然后创建两个函数来获取和设置其值是完全不必要的。代码的任何部分仍然可以修改变量,但现在这样做更烦人,如果没有正确优化,也可能导致代码速度变慢。总而言之,通过创建这些函数,您只需去掉静态限定符中的变量。

一个带有getter和setter对的私有变量只是一个复杂的公共变量private和public,在一般的可访问性意义上。要么传播,要么保持全球化。如果你以后遇到一个具体的问题,因为它是全球性的,你会知道该怎么做。尽管如此,如果你真的需要在多个地方检查游戏状态,你应该重新考虑你的设计。在高级位置的某个地方进行此检查就足够了,可能在主循环中。@Nelfeal如果只有getterapi在那里呢?表示另一个模块只能获取值,不能从另一个文件中设置值。@user2520119在这种情况下,当然,这是一种方法。另一种方法是注册回调以在每个状态转换时调用,但这已经相当复杂了。如果可以的话,请简单一点。好的,谢谢你的回答,所以根据我的意见,如果只有一个文件有权设置该变量,而其他文件只能访问该变量,那么这个设计是完全使用的。在我的例子中,其他人有设置的权限,所以他们仍然可以使用设置API进行修改,所以似乎没有必要更改为静态。@user2520119是的,我也觉得没有必要。