Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当全局变量仅在一个文件中使用时,是否可以使用它们?const/constexpr全局变量通常认为可以使用吗?_C++_C++11 - Fatal编程技术网

C++ 当全局变量仅在一个文件中使用时,是否可以使用它们?const/constexpr全局变量通常认为可以使用吗?

C++ 当全局变量仅在一个文件中使用时,是否可以使用它们?const/constexpr全局变量通常认为可以使用吗?,c++,c++11,C++,C++11,我理解,出于以下几个原因,应尽可能避免使用全局变量: 如果全局变量的值无效,则很难调试(因为每个函数都可以访问它) 对于多个文件上的多个全局变量,如果全局变量存在任何依赖关系(例如,如果一个文件中有a=1;而另一个文件中有extern a;b=a+1);则这些变量的值将是未定义的,因为我们无法知道这些表达式的求值顺序 const或constexpr全局变量通常可以使用吗?由于它们永远无法写入,因此它们永远不会受到第一点的影响,并且编译器在运行前对constexpr全局变量求值,因此第二点不适用于

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

  • 如果全局变量的值无效,则很难调试(因为每个函数都可以访问它)

  • 对于多个文件上的多个全局变量,如果全局变量存在任何依赖关系(例如,如果一个文件中有a=1;而另一个文件中有extern a;b=a+1);则这些变量的值将是未定义的,因为我们无法知道这些表达式的求值顺序

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

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

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

        namespace ApproximateMathConstants{
          const double pi = 3.0;
          const double e = 2.0;
        }
    
    如果希望保留示例中的全局变量以避免传递太多参数,更好的选择可能是将其中一些参数封装到类对象中。 或者,将函数转换为类的成员函数/方法,该类可以访问成员变量

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


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

    不值得冒养成坏习惯的风险。不管怎么说,这个问题似乎很有舆论基础。并学习如何将所需作为参数传递,如果需要4个以上的参数(粗略的经验法则)——现在是时候看看是否可以重新考虑代码,这样就不需要4个以上的参数了。我认为全局constepr变量通常是可以的。例如,如果数字
    42
    位于少数位置,则为该数字命名并使用描述性名称而不是数字会更清晰。这个问题似乎有点离题了。