是否可以在C++ (C) 中使用全局范围对象(结构)?

Is it OK to use global-scope objects (structs) in C++ (C)?

本文关键字:全局 范围 对象 结构 C++ 是否      更新时间:2023-10-16

众所周知,不必要地使用全局变量是一个坏习惯,并且倾向于保持范围尽可能小。

但是物体呢?或者 C 中类似函数的结构实例化。跨多个源文件使用全局对象有什么问题吗?

感谢您对这个问题有所了解,因为我刚刚得到了一点......错位。

摘要

全局标量类型变量是一种工具,工具没有好坏之分,它们的使用是恰当的还是不恰当的。将类的力量添加到该工具中没有好坏之分,它有可能提高适当性或恶化适当性。

对象

答案需要对象的定义。对象不是变量的补码。变量的补码是恒定的。我将使用"标量类型"作为对象的补充。

使用全局标量类型变量的问题

似乎全局变量的问题通常是相关的

  • 非本地性
  • 无约束检查
  • 耦合
  • 并发问题
  • 命名空间污染
  • 测试和调试

我认为只要我们谈论标量类型的内存占用是一个至少对于 PC 来说被认为是过时的论点,嵌入式可能是另一回事。

备注:常量没有所有这些问题,这就是为什么全局常量比全局变量更常见。

使用全局对象的问题

你必须问问自己,通过使用对象而不是标量类型变量是否可以消除这些问题。

所有这些问题也适用于对象。

此外,它们将类的所有复杂性都添加到顶部,并使这些反对意见中的每一个变得更糟,至少在总体上是这样。

对于对象,您只是有更多的位置来破坏所有内容,只是一些位置会因副作用而阻碍调试。对象有变得稍微复杂的趋势,这增加了潜在的一致初始化问题。

对于对象,您突然不仅必须管理访问与否,而且还必须确保每个访问点都与对象的当前接口和基础数据类型的约束兼容。确保程序的各个部分正确管理所有权。

我认为这不是一个意见问题:如果你认为全局标量类型变量是坏的,你将不得不认为全局对象是坏的。

暨格拉诺萨利斯

当然,全局标量类型变量和全局对象都有正确且完全合理的应用。

如果几个全局变量在逻辑上是连接的,我认为将这些连接捆绑在一个全局对象中可能会解决一些反对意见。 例如,当您在对象中移动一些全局标量类型变量时,命名空间污染当然会减少。当然,如果这些变量中存在不变性,那么全局对象的类是您首先要查找它的地方,而类绝对是编写该不变性的最佳位置。二传手可能是缓解缺少约束问题的工具。