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


当前回答

绝对不是。但是滥用它们……这很糟糕。

出于某种原因而无意识地删除它们只是……盲目的。除非您知道其优点和缺点,否则最好避免使用全局变量,并按照您学到的方法进行操作,但全局变量并没有什么隐含的错误。当你了解了利弊后,最好自己做决定。

其他回答

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

实际上,不使用全局变量总是更好。只需编写大坝获取和设置方法,并在一天、一周或一个月后当你需要它们时通知你。

我想要反驳这篇文章所提出的观点,即它使多线程更加困难或根本不可能。全局变量是共享状态,但全局变量的替代方法(例如传递指针)也可能共享状态。多线程的问题在于如何正确地使用共享状态,而不是该状态是否恰好通过全局变量或其他方式共享。

大多数情况下,当你执行多线程时,你需要共享一些东西。例如,在生产者-消费者模式中,您可以共享一些包含工作单元的线程安全队列。您可以共享它,因为该数据结构是线程安全的。当涉及到线程安全时,队列是否是全局的完全无关紧要。

在这个线程中隐含的希望是,在不使用全局变量的情况下,将程序从单线程转换为多线程会更容易,这是天真的。是的,全局变量让搬起石头砸自己的脚变得更容易,但搬起石头砸自己的方法有很多。

我并不提倡全局变量,因为其他观点仍然成立,我的观点仅仅是程序中的线程数与变量作用域无关。

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

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

重要的是要记住总体目标:清晰

“无全局变量”规则的存在是因为大多数时候,全局变量使代码的含义不太清楚。

然而,像许多规则一样,人们记住的是规则,而不是规则的意图。

我曾经见过一些程序,为了避免全局变量的危害,通过传递大量参数,使代码的大小增加了一倍。最后,使用全局变量将使程序对阅读它的人更清楚。由于盲目地遵守规则的文字,原来的程序员未能实现规则的意图。

所以,是的,全局变量通常不好。但是如果你觉得在最后,程序员的意图通过使用全局变量变得更加清晰,那么就继续吧。但是,请记住,当您强迫某人访问第二段代码(全局代码)以理解第一部分是如何工作的时,清晰度会自动下降。

全局变量是不好的,如果它们允许您操作应该只在本地修改的程序的某些方面。在面向对象编程中,全局变量经常与封装思想相冲突。