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

标签 c global-variables program-structure

我使用的是 C(不是 C++),我不确定如何避免使用全局变量。

我对 C 及其语法以及如何编写基本应用程序有相当不错的掌握,但我不确定构建程序的正确方法。

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

是否有任何我可以查看的严格用 C 语言编写的优秀开源软件?我想不出有什么特别的,它们中的大多数似乎都是用 C++ 编写的。

谢谢。

编辑

这是我在简单的 API Hook 应用程序中使用全局变量的示例,它只是另一个进程中的 DLL。

这个应用程序,特别是 Hook 另一个应用程序中使用的 API 函数。它通过使用 WriteProcessMemory 覆盖对原始调用并使其成为对我的 DLL 的调用来实现这一点。

但是,当unhook API函数时,我必须写回原来的内存/机器码。

因此,我需要为该机器代码维护一个简单的字节数组,一个用于 Hook 的每个 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 );

抱歉,如果这让您感到困惑。

最佳答案

"How do really big applications avoid the use of global variables?"

  1. 使用静态变量。如果函数需要在调用之间记住某些内容,请使用 this 而不是全局变量。示例:

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

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

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

关于C - 程序结构(避免全局变量、包含等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3208531/

相关文章:

c - 从数组和程序中提取整数值而不显示 printf 函数

c - 是否可以使用一些项目设置或 makefile 选项将一些宏定义到头文件中?

python - 是否可以生成整个 Django webapp 的图表?

递归函数和全局变量与局部变量

c++ - 为 'FileCase' 错误指定的存储类

javascript - 如何构建大型 AngularJS 应用程序

C++ 二次方程求解器 - 不正确的虚数解

c - 内存分配和更改值

c - 为什么我的 cuda C 代码在单精度下没有变得更快?

crystal-reports - 我如何使用 DateDiff() 通过分组而不只是整个数据集来给我一个差异?