lon*_*ger 32 c embedded global-variables
我看到使用全局变量的大多数异议都有意义,因为它们涉及多线程,线程安全等问题.
但是在一个小的,单线程的,非操作系统的情况下,你有什么异议?就我而言,如果重要的话,我正在用"C"编写我的嵌入式系统.我也是该产品的唯一开发人员.
为什么消除全局变量会使我的代码更好?
(在阅读了几个响应之后,我意识到我也应该指出这个系统没有动态内存分配(例如malloc).所有内存都是在编译时静态分配的.)
Wil*_*ung 54
它不会.
全局变量的两个基本问题是简单地混淆命名空间,以及"没有人"对它们"控制"的事实(因此潜在的冲突和与多个线程的冲突).
"全局性很糟糕",就像几乎所有其他计算机编程习惯用语一样,而不是硬性规则.当制定这些"规则"时,最好不要简单地通过死记硬背来理解规则制定背后的情况和动机.不要盲目地接受它们.
在您的情况下,您似乎了解系统的性质和规则的参数,并认为它不适用于这种情况.你是对的,事实并非如此.
所以,不要担心.
e.J*_*mes 21
全局变量不一定是坏的,正如宏不一定是坏的,浓缩铀不一定是坏的.只要你有意识地决定给定设计选择的利弊,你应该没事.
针对全局变量的一些论据是:
一些全局变量的争论者:
如果在您的设计中,全局变量有意义,并且可以用来使您的代码更易于阅读或更易于维护,而无需为随机错误和测试头痛做好准备,那么一定要使用它们.
我为嵌入式微控制器编写了很多C代码,并且我一直使用全局变量.在这样一个僵化的系统中,全局变量是有意义的.我知道潜在的缺点,但我已经分析了利弊,我编写了我的代码,以防止主要的陷阱.
底线:没有硬性规定.根据您拥有的最佳信息,为您的特定项目或平台做出最佳决策.
TSt*_*per 19
这是一篇很好的文章,给出了为什么全局变量为坏的原因
为什么在不必要的时候应该避免全局变量?
非本地化 - 当各个元素的范围有限时,源代码最容易理解.全局变量可以由程序的任何部分读取或修改,使得难以记住或推理每种可能的用途.无访问控制或约束检查 - 程序的任何部分都可以获取或设置全局变量,并且可以轻松地删除或忘记有关其使用的任何规则.
隐式耦合 - 具有许多全局变量的程序通常在这些变量之间存在紧密耦合,以及变量和函数之间的耦合.将耦合项目分组为有凝聚力的单元通常会带来更好的计划.
内存分配问题 - 某些环境具有内存分配方案,使得全局变量分配变得棘手.在"构造函数"具有除分配之外的副作用的语言中尤其如此(因为,在这种情况下,您可以表示两个全局变量彼此相互依赖的不安全情况).此外,当动态链接模块时,可能不清楚不同的库是否有自己的全局变量实例或者是否共享全局变量.
测试和限制 - 使用全局变量的源更难以测试,因为在运行之间无法轻易建立"干净"的环境.更一般地,利用未明确提供给该源的任何类型的全局服务的源很难以相同的原因进行测试.
添加全局变量非常简单.养成宣布它们的习惯很容易.它比想到一个好的设计要快得多.
全局变量并不像你想象的那么糟糕,只要不必要就应该避免它们.全局变量可以很好地用于在程序中使用的变量,确保记住您始终必须跟踪变量的变化位置; 但对于往往只在程序的有限部分内使用的变量,有充分的理由避免将其全局化.
在用C编写的小型嵌入式应用程序中,全局变量是必需的.例如,您需要使用全局变量才能在中断服务程序和另一个模块之间传递信息.这些是一些提示,可以帮助您有效地使用嵌入式应用程序中的全局变量:
区分静态变量和全局变量.静态变量可以在同一个C文件中的所有函数中使用.它们相当于C++类中的私有成员.在C中,你必须自己完成编译器的工作.使用static关键字可以避免在模块外部意外使用变量并明确其范围.您可能希望在变量前加上模块的名称.
遵循全局变量的命名约定(由许多C文件使用).明确表明它们是全球性的.
如果您需要大量全局变量,请考虑将它们捆绑在一个结构中.
必要时使用volatile关键字.如果ISR修改了全局变量,则需要这样做.