C - 程序结构(避免全局变量,包括等)
-
13-09-2020 - |
题
我正在使用c(不是c ++),我不确定如何避免使用全局变量。
我对c,它的语法和如何编写基本应用程序很重要,但我不确定建立程序的正确方法。
真正的大应用如何避免使用全局变量?我很确定总会有一些,但对于在C中写的大型游戏和其他应用程序,是什么最好的方法?
是否有任何良好的,开源软件,我可以看出我可以看的是什么?我想不出任何偏僻的东西,他们中的大多数似乎都在c ++。
谢谢。
编辑
这是我在一个简单的API挂钩应用程序中使用全局变量的示例,它只是另一个进程内的DLL。
本应用,具体地,在另一个应用程序中使用的钩子API函数。它通过使用WriteProcessMemory来实现这一点来覆盖对原件的调用,并使其调用我的DLL。
但是,当 Un 挂钩API函数时,我必须重写原始存储器/机器代码。所以,我需要为该机器代码维护一个简单的字节数组,一个用于挂钩的每个API函数,并且有很多。
// Global variable to store original assembly code (6 bytes)
BYTE g_MessageBoxA[6];
// Hook the API function
HookAPIFunction ( "user32.dll", "MessageBoxA", MyNewFunction, g_MessageBoxA );
// Later on, unhook the function
UnHookAPIFunction ( "user32.dll", "MessageBoxA", g_MessageBoxA );
.
抱歉,如果那是令人困惑的话。 解决方案
“真正的大应用如何避免使用全局变量?”
-
使用静态变量。如果函数需要在呼叫之间记住某些内容,请使用此与全局变量。示例:
int running_total (int num) { static int sum = 0; sum += num; return sum; }
-
通过参数传递数据,以便定义一个地方,也可以是生成的,并且传递给所需的位置。
-
如果所有其他人失败,请继续并使用全局但尝试和减轻潜在问题。
- 至少使用命名约定来最大限度地减少潜在的冲突。例如:
main()
。因此,所有全局变量都将从Gbl_MyApp_DeveloperName
部分开始 - 其中“MyApp”是您的应用程序的描述性。
- 至少使用命名约定来最大限度地减少潜在的冲突。例如:
- 尝试按目的进行组函数,以便在相同的文件中需要给定的全局(在原因内)。然后可以将全局定义并限制在该文件中(要小心
Gbl_MyApp_
关键字)。
其他提示
全局变量有一些有效的用途。学校开始教导他们是邪恶的,让程序员懒惰和过度使用它们。如果您确定数据真的需要数据,请使用它们。鉴于你担心做一份好工作,我认为你不会使用自己的判断来走得太远。
很容易 - 根本不要使用它们。创建主()函数中的全局变量的内容,然后将它们从那里传递给需要的参数到需要它们的函数。
在我的学院学习C的最佳推荐开源软件一直是Linux所以你可以从他们的来源获得示例。
我觉得相同,全局很糟糕,降低可读性并提高错误可能性和其他问题。
我会解释我的例子。我有一个主要的()做得很少的事情。最大的动作来自定时器和外部中断。这些都是没有参数的函数,由于平台我正在使用,32位微控制器。我无法通过参数,此外,这些中断和定时器是异步的。最简单的方法是全局,想象一下,中断填充缓冲区,此缓冲区在计时器内解析,并使用已解析的信息,存储在其他定时器中。 好的,我可以在主函数中提取一个中断标志和过程,但是在执行关键软件时,这种方式就不是好主意。
这是唯一的全局变量,不会让我感觉不好; - )
全局变量几乎是不可避免的。但是,它们通常过度使用。它们不是通过适当参数和设计正确的数据结构的替代品。
每次想要一个全局变量,想:如果我需要一个,那么怎么办?