我正在使用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 );
. 抱歉,如果那是令人困惑的话。

有帮助吗?

解决方案

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

  1. 使用静态变量。如果函数需要在呼叫之间记住某些内容,请使用此与全局变量。示例:

    int running_total (int num) {
        static int sum  = 0;
        sum             += num;
        return sum;
    }
    
  2. 通过参数传递数据,以便定义一个地方,也可以是生成的,并且传递给所需的位置。

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

    1. 至少使用命名约定来最大限度地减少潜在的冲突。例如:main()。因此,所有全局变量都将从Gbl_MyApp_DeveloperName部分开始 - 其中“MyApp”是您的应用程序的描述性。
    2. 尝试按目的进行组函数,以便在相同的文件中需要给定的全局(在原因内)。然后可以将全局定义并限制在该文件中(要小心Gbl_MyApp_关键字)。

其他提示

全局变量有一些有效的用途。学校开始教导他们是邪恶的,让程序员懒惰和过度使用它们。如果您确定数据真的需要数据,请使用它们。鉴于你担心做一份好工作,我认为你不会使用自己的判断来走得太远。

很容易 - 根本不要使用它们。创建主()函数中的全局变量的内容,然后将它们从那里传递给需要的参数到需要它们的函数。

在我的学院学习C的最佳推荐开源软件一直是Linux所以你可以从他们的来源获得示例。

我觉得相同,全局很糟糕,降低可读性并提高错误可能性和其他问题。

我会解释我的例子。我有一个主要的()做得很少的事情。最大的动作来自定时器和外部中断。这些都是没有参数的函数,由于平台我正在使用,32位微控制器。我无法通过参数,此外,这些中断和定时器是异步的。最简单的方法是全局,想象一下,中断填充缓冲区,此缓冲区在计时器内解析,并使用已解析的信息,存储在其他定时器中。 好的,我可以在主函数中提取一个中断标志和过程,但是在执行关键软件时,这种方式就不是好主意。

这是唯一的全局变量,不会让我感觉不好; - )

全局变量几乎是不可避免的。但是,它们通常过度使用。它们不是通过适当参数和设计正确的数据结构的替代品。

每次想要一个全局变量,想:如果我需要一个,那么怎么办?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top