为什么全局变量在单线程,非os,嵌入式应用程序中是坏的

lon*_*ger 32 c embedded global-variables

我看到使用全局变量的大多数异议都有意义,因为它们涉及多线程,线程安全等问题.

但是在一个小的,单线程的,非操作系统的情况下,你有什么异议?就我而言,如果重要的话,我正在用"C"编写我的嵌入式系统.我也是该产品的唯一开发人员.

为什么消除全局变量会使我的代码更好?

(在阅读了几个响应之后,我意识到我也应该指出这个系统没有动态内存分配(例如malloc).所有内存都是在编译时静态分配的.)

Wil*_*ung 54

它不会.

全局变量的两个基本问题是简单地混淆命名空间,以及"没有人"对它们"控制"的事实(因此潜在的冲突和与多个线程的冲突).

"全局性很糟糕",就像几乎所有其他计算机编程习惯用语一样,而不是硬性规则.当制定这些"规则"时,最好不要简单地通过死记硬背来理解规则制定背后的情况和动机.不要盲目地接受它们.

在您的情况下,您似乎了解系统的性质和规则的参数,并认为它不适用于这种情况.你是对的,事实并非如此.

所以,不要担心.

  • 我很欣赏这些评论和答案.我选择这个作为我的答案,因为它最清楚地总结了我的理由.我觉得'有趣'选择一个能够验证我的设计选择的答案,但是嘿,我想无论如何我都会. (7认同)
  • 这是我在这个网站上读过的最好的答案之一. (4认同)

e.J*_*mes 21

全局变量不一定是坏的,正如宏不一定是坏的,浓缩铀不一定是坏的.只要你有意识地决定给定设计选择的利弊,你应该没事.

针对全局变量的一些论据是:

  1. 它们违反了良好的面向对象设计
  2. 它们使您的代码难以进行单元测试,因为您无法在不设置代码期望看到的所有全局变量的情况下测试单个代码块
  3. 它们会增加代码中的耦合:一个代码块中的操作可能会通过共享的全局变量以不可预测的方式影响另一个代码块中的内容

一些全局变量的争论:

  1. 它们使得在许多功能之间共享单个资源变得容易
  2. 它们可以使代码更易于阅读

如果在您的设计中,全局变量有意义,并且可以用来使您的代码更易于阅读或更易于维护,而无需为随机错误和测试头痛做好准备,那么一定要使用它们.

我为嵌入式微控制器编写了很多C代码,并且我一直使用全局变量.在这样一个僵化的系统中,全局变量是有意义的.我知道潜在的缺点,但我已经分析了利弊,我编写了我的代码,以防止主要的陷阱.

底线:没有硬性规定.根据您拥有的最佳信息,为您的特定项目或平台做出最佳决策.

  • +1浓缩铀比较. (3认同)

TSt*_*per 19

这是一篇很好的文章,给出了为什么全局变量为坏的原因

为什么在不必要的时候应该避免全局变量?

非本地化 - 当各个元素的范围有限时,源代码最容易理解.全局变量可以由程序的任何部分读取或修改,使得难以记住或推理每种可能的用途.无访问控制或约束检查 - 程序的任何部分都可以获取或设置全局变量,并且可以轻松地删除或忘记有关其使用的任何规则.

隐式耦合 - 具有许多全局变量的程序通常在这些变量之间存在紧密耦合,以及变量和函数之间的耦合.将耦合项目分组为有凝聚力的单元通常会带来更好的计划.

内存分配问题 - 某些环境具有内存分配方案,使得全局变量分配变得棘手.在"构造函数"具有除分配之外的副作用的语言中尤其如此(因为,在这种情况下,您可以表示两个全局变量彼此相互依赖的不安全情况).此外,当动态链接模块时,可能不清楚不同的库是否有自己的全局变量实例或者是否共享全局变量.

测试和限制 - 使用全局变量的源更难以测试,因为在运行之间无法轻易建立"干净"的环境.更一般地,利用未明确提供给该源的任何类型的全局服务的源很难以相同的原因进行测试.

添加全局变量非常简单.养成宣布它们的习惯很容易.它比想到一个好的设计要快得多.

全局变量并不像你想象的那么糟糕,只要不必要就应该避免它们.全局变量可以很好地用于在程序中使用的变量,确保记住您始终必须跟踪变量的变化位置; 但对于往往只在程序的有限部分内使用的变量,有充分的理由避免将其全局化.


Otá*_*cio 8

因为它使耦合最小化.你的系统现在可能很小,但如果你继续工作,可能结果不是.

  • 这是我想要的.仅仅因为它很小而且单线程现在并不意味着它总是如此. (2认同)

kgi*_*kis 7

在用C编写的小型嵌入式应用程序中,全局变量是必需的.例如,您需要使用全局变量才能在中断服务程序和另一个模块之间传递信息.这些是一些提示,可以帮助您有效地使用嵌入式应用程序中的全局变量:

  • 区分静态变量和全局变量.静态变量可以在同一个C文件中的所有函数中使用.它们相当于C++类中的私有成员.在C中,你必须自己完成编译器的工作.使用static关键字可以避免在模块外部意外使用变量并明确其范围.您可能希望在变量前加上模块的名称.

  • 遵循全局变量的命名约定(由许多C文件使用).明确表明它们是全球性的.

  • 如果您需要大量全局变量,请考虑将它们捆绑在一个结构中.

  • 必要时使用volatile关键字.如果ISR修改了全局变量,则需要这样做.


小智 6

使用全局变量的代码更难维护.由于维护者必须先找到系统中变量的每一个用法,然后才能准确地知道变量的作用.由于这会减慢维护速度,因此应尽可能避免使用.就是这样