使用全局变量最优雅的方法是什么?
What is the most elegant way to work with 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
。
这很好用,但是有没有更优雅的方法来处理它?
我不确定全局变量在所有情况下都是不好的,但您确实需要努力工作才能拥有很少的全局变量(否则,您的代码将无法阅读)。比如<stdio.h>
有stdout
,如果换成一些FILE*get_standard_output(void);
getter功能也不会更好
根据经验,避免在整个程序中使用超过 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 (or some other kind of synchronization or atomicity). Consider reading this pthread tutorial.
来保护全局数据
全局变量并不危险。它有帮助。但最佳做法是始终限制变量的范围。
使用静态设置全局变量并公开函数以获取和设置值。
例如:在global.c
static int gMyGlobalVariable;
int getMyGlobalVariableValue()
{
return gMyGlobalVariable;
}
void setMyGlobalVariableValue(int set)
{
gMyGlobalVariable = set;
}
例如:在global.h
void setMyGlobalVariableValue(int set);
int getMyGlobalVariableValue();
这将更好地控制多线程情况。
几年前我了解到全局变量不好,应该避免。但我知道它们有时是不可避免的,至少在嵌入式系统中是这样。您认为与他们合作最优雅的方式是什么?
在我的项目中,我有一个名为 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
。
这很好用,但是有没有更优雅的方法来处理它?
我不确定全局变量在所有情况下都是不好的,但您确实需要努力工作才能拥有很少的全局变量(否则,您的代码将无法阅读)。比如<stdio.h>
有stdout
,如果换成一些FILE*get_standard_output(void);
getter功能也不会更好
根据经验,避免在整个程序中使用超过 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 (or some other kind of synchronization or atomicity). Consider reading this pthread tutorial.
来保护全局数据全局变量并不危险。它有帮助。但最佳做法是始终限制变量的范围。
使用静态设置全局变量并公开函数以获取和设置值。
例如:在global.c
static int gMyGlobalVariable;
int getMyGlobalVariableValue()
{
return gMyGlobalVariable;
}
void setMyGlobalVariableValue(int set)
{
gMyGlobalVariable = set;
}
例如:在global.h
void setMyGlobalVariableValue(int set);
int getMyGlobalVariableValue();
这将更好地控制多线程情况。