C++ 全局变量坏吗?

C++ 全局变量坏吗?,c++,c,global-variables,C++,C,Global Variables,在C/C++中,全局变量是否像我的教授认为的那样糟糕?是的,但在停止使用全局变量的代码并开始编写使用全局变量的代码之前,不会产生全局变量的成本。但成本仍然存在 换句话说,这是一种长期的间接成本,因此大多数人认为这并不坏。全局变量是坏的,如果它们允许您操作程序的某些方面,而这些方面只应在本地进行修改。在OOP中,全局变量常常与封装思想相冲突。我的教授曾经说过这样的话:如果正确使用全局变量,使用全局变量是可以的。我不认为我能很好地正确使用它们,所以我很少使用它们。全局变量和你做的一样糟糕,同样糟糕

在C/C++中,全局变量是否像我的教授认为的那样糟糕?

是的,但在停止使用全局变量的代码并开始编写使用全局变量的代码之前,不会产生全局变量的成本。但成本仍然存在


换句话说,这是一种长期的间接成本,因此大多数人认为这并不坏。

全局变量是坏的,如果它们允许您操作程序的某些方面,而这些方面只应在本地进行修改。在OOP中,全局变量常常与封装思想相冲突。

我的教授曾经说过这样的话:如果正确使用全局变量,使用全局变量是可以的。我不认为我能很好地正确使用它们,所以我很少使用它们。

全局变量和你做的一样糟糕,同样糟糕

如果要创建完全封装的程序,可以使用globals。使用globals是一种“罪恶”,但编程罪恶在很大程度上是哲学的

如果您签出,您将看到一种语言,其变量仅为全局变量。它是不可伸缩的,因为所有库都别无选择,只能使用globals

也就是说,如果你有选择,并且可以忽略程序员的哲学,那么globals并不是那么糟糕

如果你使用得当,Gotos也不是


最大的“坏”问题是,如果你用错了,人们会尖叫,火星着陆器会坠毁,世界会爆炸……或者诸如此类的事情。

我会用另一个问题来回答这个问题:你用的是Singelton吗


因为(几乎所有)singelton的使用都是一个值得称赞的全球变量。

我认为你的教授正在试图在坏习惯开始之前就阻止它


全局变量有其位置,正如许多人所说,知道在何处和何时使用它们可能很复杂。所以我认为,与其深入探究为什么,如何,何时,何地,你们的教授决定禁止的全球变量的本质,还不如深入探究。谁知道呢,他可能会在将来取消对它们的禁止。

全局变量通常是不好的,特别是如果其他人正在使用相同的代码,并且不想花20分钟搜索变量引用的所有位置。添加修改变量的线程会带来全新的麻烦


在一个翻译单元中使用的匿名名称空间中的全局常量在专业应用程序和库中很好且无处不在。但是,如果数据是可变的,并且/或者必须在多个TU之间共享,那么您可能需要对其进行封装——如果不是为了设计,那么是为了调试或使用您的代码的任何人。

全局变量的问题是,由于每个函数都可以访问这些变量,弄清楚哪些函数真正读写这些变量变得越来越困难

要理解应用程序是如何工作的,您几乎必须考虑修改全局状态的每个函数。这是可以做到的,但随着应用程序的增长,它将变得越来越难以达到几乎不可能的程度(或者至少是完全浪费时间)


如果不依赖全局变量,则可以根据需要在不同的函数之间传递状态。这样,您就有更好的机会了解每个函数的作用,因为您不需要考虑全局状态。

全局变量在小程序中很好,但如果在大程序中以同样的方式使用,则很可怕

这意味着你可以很容易地养成在学习时使用它们的习惯。这就是你的教授试图保护你的原因


当你有更多的经验时,当它们正常时,学习起来会更容易。

只有在你别无选择时才应该使用全局变量。是的,这包括单身人士。90%的情况下,引入全局变量可以节省传递参数的成本。然后发生多线程/单元测试/维护编码,您就有问题了

所以,是的,在90%的情况下,全局变量是不好的。你在大学期间不太可能看到例外情况。我能想到的一个例外是处理固有的全局对象,比如中断表。DB connection之类的东西似乎是全局性的,但并非如此。

正如有人在另一篇文章中所说(我在解释)“在你完全理解这样做的后果之前,不应该违反这样的规则。”

有时需要全局变量,或者至少非常有用(例如,使用系统定义的回调)。另一方面,他们也非常危险,因为他们告诉你的所有原因


编程的许多方面可能都应该留给专家。有时候你需要一把非常锋利的刀。但是,在准备好之前,您无法使用一个变量…

迟早您需要更改变量的设置方式或访问时发生的情况,或者您只需要查找更改的位置


实际上,最好不要使用全局变量。只需编写dam get和set方法,并在一天、一周或一个月后需要时为您提供帮助。

使用全局变量有点像在地毯下扫地。这是一个快速的解决办法,而且在短期内比用集尘盘或真空吸尘器清理要容易得多。然而,如果你以后再搬动地毯,你会发现地毯下面会有一大堆令人惊讶的东西。

不,它们一点也不坏。您需要查看编译器生成的(机器)代码才能做出此判断,有时使用局部代码要比使用全局代码糟糕得多。还要注意的是,将“静态”放在局部变量上基本上是使其成为一个全局变量(并且会产生其他丑陋的问题,而真正的全局变量可以解决这些问题)。“本地全球”尤其糟糕

Globals还为您提供了对内存使用的清晰控制,这对于本地人来说要困难得多。这些是d