在C/ c++中,全局变量像我的教授认为的那样糟糕吗?
当前回答
全局变量的使用实际上取决于需求。它的优点是减少了重复传递值的开销。
但是你的教授是对的,因为它会引起安全问题,所以应该尽可能避免使用全局变量。全局变量还会产生一些问题,有时难以调试。
例如:-
变量值在运行时被修改的情况。此时,很难确定是哪部分代码在什么条件下修改了它。
其他回答
全局变量是不好的,如果它们允许您操作应该只在本地修改的程序的某些方面。在面向对象编程中,全局变量经常与封装思想相冲突。
全局变量通常很糟糕,特别是当其他人正在处理相同的代码,并且不想花20分钟搜索变量被引用的所有位置时。添加修改变量的线程带来了一个全新的问题。
在单个翻译单元中使用匿名名称空间中的全局常量是很好的,在专业应用程序和库中无处不在。但是如果数据是可变的,并且/或者它必须在多个tu之间共享,那么您可能想要封装它——如果不是为了设计,那么也是为了任何人调试或使用您的代码。
是的,因为如果你让不称职的程序员使用它们(阅读90%,尤其是科学家),你最终会得到600多个全局变量分布在20多个文件和一个12000行的项目中,其中80%的函数采用void,返回void,完全在全局状态下运行。
除非你了解整个项目,否则你很快就不可能在任何一个点上理解正在发生什么。
正如有人在另一篇文章中所说的那样:“在你完全理解这样做的后果之前,不应该打破这样的规则。”
有时候,全局变量是必要的,或者至少是非常有用的(例如,处理系统定义的回调)。另一方面,他们也非常危险,因为所有你被告知的原因。
编程的许多方面可能应该留给专家去做。有时候你需要一把非常锋利的刀。但在你准备好之前,你不能使用它……
我通常对很少改变的值使用全局变量,如单例或动态加载库中函数的函数指针。在多线程应用程序中使用可变全局变量往往会导致难以跟踪错误,所以我尽量避免将其作为通用规则。
使用全局变量而不是传递参数通常更快,但如果您正在编写一个多线程应用程序(您现在经常这样做),它通常不会很好地工作(您可以使用线程静态,但性能收益是值得怀疑的)。