我正在使用C(不是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 );
对不起,如果那令人困惑。
答案 0 :(得分:7)
“真正的大型应用程序如何避免使用全局变量?”
使用静态变量。如果函数需要记住调用之间的某些内容,请使用此对全局变量。例如:
int running_total (int num) {
static int sum = 0;
sum += num;
return sum;
}
通过参数传递数据,以便将值定义在一个地方,可能是main()
并传递到需要的位置。
如果所有其他方法都失败了,请继续使用全局但尝试并减轻潜在问题。
Gbl_MyApp_DeveloperName
。因此,所有全局变量都将从Gbl_MyApp_
部分开始 - 其中“MyApp”是描述您应用的内容。extern
关键字)。答案 1 :(得分:2)
全局变量有一些有效用途。学校开始教导他们是邪恶的,以防止程序员懒惰和过度使用它们。如果您确定数据确实是全局需要的,那么请使用它们。鉴于你担心做得好,我不认为你会根据自己的判断做错太多。
答案 2 :(得分:2)
这很简单 - 只是不要使用它们。创建main()函数中的全局变量,然后将它们作为参数传递给需要它们的函数。
答案 3 :(得分:1)
在我的大学里学习C的最佳推荐的开源软件是Linux,所以你可以从他们的来源获得例子。
答案 4 :(得分:1)
我认为同样,全局变量很糟糕,降低了可读性并增加了错误可能性和其他问题。
我会解释我的例子。我有一个main()做了很少的事情。大部分动作来自定时器和外部中断。这些是没有参数的功能,因为我正在使用的平台,32位微控制器。我无法传递参数,此外,这些中断和定时器是异步的。最简单的方法是填充缓冲区的全局,想象,中断,此缓冲区在计时器内解析,解析的信息在其他计时器中使用,存储和发送。 好的,我可以在主函数中拉出一个中断标志和进程,但是当执行关键软件时这样做并不是一个好主意。
这是唯一一种不会让我感觉不舒服的全局变量; - )
答案 5 :(得分:0)
全局变量几乎是不可避免的。但是,它们经常被滥用。它们不能代替传递适当的参数和设计正确的数据结构。
每当你想要一个全局变量时,请想一想:如果我还需要一个这样的变量怎么办?