Mik*_*ike 5 c coding-style global-variables
几年前,我了解到全局变量不好,应该避免。但我知道它们有时是不可避免的,至少在嵌入式系统中是这样。您认为与他们合作最优雅的方式是什么?
\n\n在我的项目中,我有一个名为的文件globals.h,我在其中定义所有全局变量:
#ifndef GLOBALS_H\n#define GLOBALS_H\nextern int16_t gVariable1;\nextern int16_t gVariable2;\n\xe2\x80\xa6.\n#endif\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n\n并且知道我将其包含globals.h在需要访问全局变量的项目的每个其他文件中。
这很好用,但是有没有更优雅的方法来处理这个问题?
\n我不确定全局变量在所有情况下都是不好的,但你确实需要努力减少它们(否则,你的代码不可读)。例如<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 教程。