global.h
#ifndef GLOBALS_H
#define GLOBALS_H
extern int16_t gVariable1;
extern int16_t gVariable2;
….
#endif
main.c
/*
***********************************************************************
* 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);
,但是,您可以打包(巧妙且品味良好,以使您的代码可读)几个
链式变量添加到
struct
类型的单个变量中。以您的示例,这可能意味着您的
globals.h
:
struct globalstate_st { int16_t v1, v2; };
extern struct globalstate_st gs;
您将使用
gs.v1
而不是gVariable1
;如果您对优化进行编译,则使用
gs.v1
的性能等同于使用gVariable1
.。
BTW,如果您有多线程程序,则通常应使用一些mutex
(或其他类型的同步或原子能)保护全局数据。考虑阅读this pthread教程
.
全球变量并不危险。它有帮助。但是最佳实践,请始终保持可变限制的范围。
设置具有静态和公开函数的全局变量以获取和设置值。
EG:在Global.c中
static int gMyGlobalVariable;
int getMyGlobalVariableValue()
{
return gMyGlobalVariable;
}
void setMyGlobalVariableValue(int set)
{
gMyGlobalVariable = set;
}
EG:在Global.h中
void setMyGlobalVariableValue(int set);
int getMyGlobalVariableValue();
这将更好地控制多线程的情况。