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

Mik*_*ike 5 c coding-style global-variables

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

\n\n

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

\n\n
#ifndef GLOBALS_H\n#define GLOBALS_H\nextern int16_t    gVariable1;\nextern int16_t    gVariable2;\n\xe2\x80\xa6.\n#endif\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
/*\n***********************************************************************\n*                            global variables                         *\n***********************************************************************\n*/\n    int16_t     gVariable1 = 0;\n    int16_t     gVariable2 = 0;\n\n\nint16_t main (void)\n{\n    gVariable1 = 6;\n\n    //  do other stuff\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

这很好用,但是有没有更优雅的方法来处理这个问题?

\n

Bas*_*tch 3

我不确定全局变量在所有情况下都是不好的,但你确实需要努力减少它们(否则,你的代码不可读)。例如<stdio.h>has ,如果用一些getter 函数stdout代替它也不会更好。FILE*get_standard_output(void);

根据经验,整个程序中应避免使用超过 4 或 5 个全局变量(回想一下神奇的数字 7,它暗示我们的认知局限性)。

但是,您可以将几个相关的全局变量打包(巧妙且有品味,以保持代码可读)到单个struct类型中。以你的例子来说,这可能意味着你的globals.h

struct globalstate_st { int16_t v1, v2; };
Run Code Online (Sandbox Code Playgroud)

然后

extern struct globalstate_st gs;
Run Code Online (Sandbox Code Playgroud)

你会使用gs.v1而不是gVariable1; 如果使用优化进行编译,则 using 的性能gs.v1相当于使用gVariable1.

顺便说一句,如果您有一个多线程程序,您通常应该使用一些互斥体(或其他类型的同步或原子性)来保护全局数据。考虑阅读这个 pthread 教程