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

gui*_*ar- 6 c program-structure global-variables

我正在使用C(而不是C++),我不确定如何避免使用全局变量.

我对C,它的语法以及如何编写基本应用程序有相当不错的把握,但我不确定构造程序的正确方法.

真正的大型应用程序如何避免使用全局变量?我很确定总会有至少一些,但对于用C编写的大型游戏和其他应用程序,最好的方法是什么?

是否有任何好的,开源软件严格用C编写,我可以看一下?我无法想到任何问题,其中大多数似乎都是用C++编写的.

谢谢.

编辑

下面是一个示例,我将在一个简单的API挂钩应用程序中使用全局变量,它只是另一个进程中的DLL.

具体而言,此应用程序挂钩了另一个应用程序中使用的API函数.它通过使用WriteProcessMemory覆盖对原始的调用,并使其调用我的DLL来实现.

但是,当取消挂起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 );
Run Code Online (Sandbox Code Playgroud)

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

Bro*_*ams 8

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

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

    int running_total (int num) {
        static int sum  = 0;
        sum             += num;
        return sum;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过参数传递数据,以便将值定义在一个地方,也许main()并传递到需要的位置.

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

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

  • 看起来像位于不同文件中的静态变量可能比单个globals.h文件中的全局变量(前缀为某些东西)更难跟踪. (2认同)