使用全局变量的最优雅方法是什么?

时间:2018-10-26 11:58:02

标签: c coding-style global-variables

几年前,我了解到全局变量是不好的,应该避免。但是我知道它们有时是不可避免的,至少在嵌入式系统中是如此。您认为与他们合作的最优雅的方式是什么?

在我的项目中,我有一个名为globals.h的文件,其中定义了所有全局变量:

#ifndef GLOBALS_H
#define GLOBALS_H
extern int16_t    gVariable1;
extern int16_t    gVariable2;
….
#endif

在主项目文件中,声明所有全局变量:

/*
***********************************************************************
*                            global variables                         *
***********************************************************************
*/
    int16_t     gVariable1 = 0;
    int16_t     gVariable2 = 0;


int16_t main (void)
{
    gVariable1 = 6;

    //  do other stuff
}

并且知道我在需要访问全局变量的项目的每个其他文件中都包含globals.h

那很好,但是有一种更优雅的方式来处理吗?

2 个答案:

答案 0 :(得分:2)

我不确定全局变量在所有情况下都是不好的,但是您真的需要努力使它们很少(否则,您的代码不可读)。例如<stdio.h>stdout,如果将其替换为某些FILE*get_standard_output(void);的吸气剂功能,那就更好了。

根据经验,请避免在整个程序中使用4个或5个以上的全局变量(将magical number seven称为对我们认知的限制的提示)。

但是,您可以将多个与相关的全局变量打包(巧妙且有品味,以使代码易于阅读)成一个struct类型。对于您的示例,这可能意味着您的globals.h

struct globalstate_st { int16_t v1, v2; };

然后

extern struct globalstate_st gs;

,您将使用gs.v1而不是gVariable1;如果您使用优化进行编译,则使用gs.v1的性能等同于使用gVariable1

顺便说一句,如果您有多线程程序,通常应该使用一些mutex(或其他某种同步或原子性)来保护全局数据。考虑阅读this pthread tutorial

答案 1 :(得分:2)

全局变量并不危险。有帮助但最佳做法是始终限制变量的范围。

使用static和暴露函数设置全局变量以获取和设置值。

例如:位于global.c

static int gMyGlobalVariable;

int getMyGlobalVariableValue()
{
   return gMyGlobalVariable;
}

void setMyGlobalVariableValue(int set)
{
   gMyGlobalVariable = set;
}

例如:位于global.h

void setMyGlobalVariableValue(int set);
int getMyGlobalVariableValue();

这将在多线程情况下提供更好的控制。