ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c-全局变量(再次)

2019-10-11 10:07:46  阅读:165  来源: 互联网

标签:c global-variables


我一直在听到永远不要使用全局变量,但是我倾向于不理会“从不”规则.真的没有例外吗?
例如,我目前正在用SDL用c编写一个小型游戏.在我看来,拥有一个指向屏幕缓冲区的指针的全局变量很有意义,因为代表游戏中不同类型事物的所有不同类都需要对它进行blit,并且只有一个屏幕缓冲区.

请告诉我是否有例外,如果没有,那么:

>为什么不这样做,或者它们有什么不好的地方,应不惜一切代价避免使用它们(请多说明一点)
>如何做到这一点,最好不必将其传递给每个构造函数以在内部存储直到需要时,或者传递给对paint()请求的每个调用.

(我认为这个问题以前是在SO上问过的,但是在搜索时找不到我需要的内容(解释和解决方法.如果有人可以将链接发布到上一个问题,那可能很棒)

解决方法:

当然,也有例外.我个人无法想到goto是正确的解决方案(或singleton是正确的解决方案)的单一情况,但是全局变量偶尔会有其用途.但是…您还没有找到有效的借口.

游戏中的大多数对象不需要重复操作,不需要访问屏幕缓冲区.那是渲染器的责任,而没有其他责任.您不希望记录器,输入管理器,AI或其他任何在屏幕上放置随机垃圾的人.

这就是为什么人们说“不要使用全局变量”的原因.这不是因为全球人是某种最终的邪恶,而是因为如果我们不这样说,人们就会陷入您的陷阱,“是的,但那条规则不适用于我,对吗?我需要一切有权访问X”.不,您需要学习构建程序.

对于无状态或静态对象(例如记录器)或应用程序的配置,更常见的例外是只读或只写的东西,真正需要从任何地方访问的东西.每行代码可能都可能需要编写一条日志消息.因此,记录器是使全球化的不二之选.但是您的代码中有99%甚至不需要知道屏幕缓冲区的存在.

简而言之,全局变量的问题是它们违反了封装:
依赖于全局代码的重用性较低.我可以使用与您使用的完全相同的类,将其放在我的应用程序中,否则它将中断.因为我没有它所依赖的全局对象网络.

这也使代码难以推理.函数f(x)将返回什么值?
显然,这取决于x是什么.但是,如果我两次传递相同的x,会得到相同的结果吗?如果它使用大量的全局变量,那么可能不会.然后,要弄清楚它将返回什么,以及还要做什么,就变得非常困难.是否要设置一些会影响其他看似不相关的函数的全局变量?

How can this be achieved, preferably without having to pass it to every constructor to be stored internally until needed

您听起来像是一件坏事.如果对象需要了解屏幕缓冲区,则应为其提供屏幕缓冲区.要么在构造函数中,要么在以后的调用中. (它有一个不错的好处:如果您的设计草率,它会提醒您.如果您有500个需要使用屏幕缓冲区的类,那么您必须将其传递给500个构造函数.这很痛苦,因此被唤醒呼叫:我做错了.很多对象不需要了解屏幕缓冲区.如何解决此问题?

作为一个更明显的例子,假设我要计算1.42的余弦,因此我将1.42传递给函数:cos(1.42)

那就是我们通常这样做的方式,没有全局变量.当然,我们可以说“是的,但是每个人都必须能够将参数设置为cos,我最好将其设置为全局”.然后看起来像这样:

gVal = 1.42;
cos();

我不了解您,但我认为第一个版本更具可读性.

标签:c,global-variables
来源: https://codeday.me/bug/20191011/1891757.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有