C - 程序结构(避免全局变量,包括等)

时间:2010-07-08 22:39:30

标签: c global-variables program-structure

我正在使用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 );

对不起,如果那令人困惑。

6 个答案:

答案 0 :(得分:7)

  

“真正的大型应用程序如何避免使用全局变量?”

  1. 使用静态变量。如果函数需要记住调用之间的某些内容,请使用此对全局变量。例如:

    int running_total (int num) {
        static int sum  = 0;
        sum             += num;
        return sum;
    }
    
  2. 通过参数传递数据,以便将值定义在一个地方,可能是main()并传递到需要的位置。

  3. 如果所有其他方法都失败了,请继续使用全局但尝试并减轻潜在问题。

    1. 至少应使用命名约定来尽量减少潜在的冲突。 EG:Gbl_MyApp_DeveloperName。因此,所有全局变量都将从Gbl_MyApp_部分开始 - 其中“MyApp”是描述您应用的内容。
    2. 尝试按目的对功能进行分组,以便需要给定全局的所有内容都在同一个文件中(在合理范围内)。然后可以定义全局变量并将其限制为该文件(请注意extern关键字)。

答案 1 :(得分:2)

全局变量有一些有效用途。学校开始教导他们是邪恶的,以防止程序员懒惰和过度使用它们。如果您确定数据确实是全局需要的,那么请使用它们。鉴于你担心做得好,我不认为你会根据自己的判断做错太多。

答案 2 :(得分:2)

这很简单 - 只是不要使用它们。创建main()函数中的全局变量,然后将它们作为参数传递给需要它们的函数。

答案 3 :(得分:1)

在我的大学里学习C的最佳推荐的开源软件是Linux,所以你可以从他们的来源获得例子。

答案 4 :(得分:1)

我认为同样,全局变量很糟糕,降低了可读性并增加了错误可能性和其他问题。

我会解释我的例子。我有一个main()做了很少的事情。大部分动作来自定时器和外部中断。这些是没有参数的功能,因为我正在使用的平台,32位微控制器。我无法传递参数,此外,这些中断和定时器是异步的。最简单的方法是填充缓冲区的全局,想象,中断,此缓冲区在计时器内解析,解析的信息在其他计时器中使用,存储和发送。 好的,我可以在主函数中拉出一个中断标志和进程,但是当执行关键软件时这样做并不是一个好主意。

这是唯一一种不会让我感觉不舒服的全局变量; - )

答案 5 :(得分:0)

全局变量几乎是不可避免的。但是,它们经常被滥用。它们不能代替传递适当的参数和设计正确的数据结构。

每当你想要一个全局变量时,请想一想:如果我还需要一个这样的变量怎么办?