如果仅在一个文件中使用全局变量,可以使用全局变量吗?通常认为const / constexpr全局变量可以使用吗?

时间:2020-02-29 23:47:41

标签: c++ c++11

我了解,出于以下几个原因,应尽可能避免使用全局变量:

  1. 很难调试全局变量是否具有无效值(因为每个函数都可以访问它)

  2. 对于多个文件中的多个全局变量,如果对全局变量有任何依赖关系(例如,如果在一个文件中有a = 1;在另一个文件中有extern a; b = a + 1;在另一个文件中),这些变量的值将是不确定的,因为我们不知道这些表达式的求值顺序。

通常可以使用const或constexpr全局变量吗?由于无法写入它们,因此它们永远不会受到第一点的影响,并且constexpr全局变量在运行时由编译器求值,因此第二点不适用于它们。另外,如果仅在文件中使用const变量定义它们,那么第二点也将不适用。

此外,在某些情况下,使用非常量全局变量确实很方便。假设它们仅在一个文件中使用,那么翻译单元的评估顺序就无关紧要,当它们真正简化您的代码时,使用少量全局变量是否值得? (例如,您不必通过引用main中的各种函数来继续传递局部变量)。

1 个答案:

答案 0 :(得分:1)

const“全局”常量可以-但是将它们放在自己的名称空间中。 下面是一个很常见的例子。 这些在全局名称空间中不存在,因此不是真正的全局。

    namespace ApproximateMathConstants{
      const double pi = 3.0;
      const double e = 2.0;
    }

如果您希望像示例中那样保留全局变量,以避免传递太多参数,那么更好的选择可能是将其中一些参数封装到类对象中。 或者,将函数转换为可以访问成员变量的类的成员函数/方法。

除了您已经提到的问题外,全局变量还会在以后引起许多其他无法预料的问题,这将非常难以调试;例如,如果您在多个线程上运行代码会发生什么?

此外,如果您有一个依赖于某些全局变量的函数,那么使用完全相同的输入两次调用完全相同的函数将导致不同的输出(如果没有,为什么要完全使用全局)。尽管这可能是您想要的,但它可能导致非常奇怪的行为。