是否可以在C++ (C) 中使用全局范围对象(结构)?
Is it OK to use global-scope objects (structs) in C++ (C)?
众所周知,不必要地使用全局变量是一个坏习惯,并且倾向于保持范围尽可能小。
但是物体呢?或者 C 中类似函数的结构实例化。跨多个源文件使用全局对象有什么问题吗?
感谢您对这个问题有所了解,因为我刚刚得到了一点......错位。
摘要
全局标量类型变量是一种工具,工具没有好坏之分,它们的使用是恰当的还是不恰当的。将类的力量添加到该工具中没有好坏之分,它有可能提高适当性或恶化适当性。
对象
答案需要对象的定义。对象不是变量的补码。变量的补码是恒定的。我将使用"标量类型"作为对象的补充。
使用全局标量类型变量的问题
似乎全局变量的问题通常是相关的
- 非本地性
- 无约束检查
- 耦合
- 并发问题
- 命名空间污染
- 测试和调试
我认为只要我们谈论标量类型的内存占用是一个至少对于 PC 来说被认为是过时的论点,嵌入式可能是另一回事。
备注:常量没有所有这些问题,这就是为什么全局常量比全局变量更常见。
使用全局对象的问题
你必须问问自己,通过使用对象而不是标量类型变量是否可以消除这些问题。
所有这些问题也适用于对象。
此外,它们将类的所有复杂性都添加到顶部,并使这些反对意见中的每一个变得更糟,至少在总体上是这样。
对于对象,您只是有更多的位置来破坏所有内容,只是一些位置会因副作用而阻碍调试。对象有变得稍微复杂的趋势,这增加了潜在的一致初始化问题。
对于对象,您突然不仅必须管理访问与否,而且还必须确保每个访问点都与对象的当前接口和基础数据类型的约束兼容。确保程序的各个部分正确管理所有权。
我认为这不是一个意见问题:如果你认为全局标量类型变量是坏的,你将不得不认为全局对象是坏的。
暨格拉诺萨利斯
当然,全局标量类型变量和全局对象都有正确且完全合理的应用。
如果几个全局变量在逻辑上是连接的,我认为将这些连接捆绑在一个全局对象中可能会解决一些反对意见。 例如,当您在对象中移动一些全局标量类型变量时,命名空间污染当然会减少。当然,如果这些变量中存在不变性,那么全局对象的类是您首先要查找它的地方,而类绝对是编写该不变性的最佳位置。二传手可能是缓解缺少约束问题的工具。
- 为什么在全局范围内使用"extern int a"似乎不行?
- C++可以在全局范围内拥有代码吗?
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 是否可以在C++ (C) 中使用全局范围对象(结构)?
- 哪个函数负责C++全局范围内的类对象初始化?
- 如何将不在 QT 全局范围内的函数附加到 Qwidget 上
- 为什么在全局范围以及命名空间std中定义了size_t
- 是否有一种方法可以避免标头文件中使用的constexpr函数输入全局范围,而无需额外的名称空间
- C - 具有全局范围的Initialze静态变量
- 如何处理警告 C4177:#pragma 'float_control' 只能在全局范围或命名空间范围内使用
- 全局范围内的对象会导致程序退出时崩溃
- 如何全局创建对象并使用该对象访问全局范围内的公共成员函数
- 有没有一种标准方法来确保一段代码在全局范围内执行
- 全局范围内的智能指针
- C 为什么在类中可以使用循环依赖性,而不是命名空间或全局范围
- c++在函数中创建对象的数组需要在全局范围内使用该数组
- 全局范围内的标识符限制
- C :枚举类型作为模板参数 - 全局范围
- 全局范围与文件范围
- 使结构内定义的枚举具有全局范围C++