显然还有很多各种各样的意见,范围从"从来没有!总是封装(即使这仅仅是宏!)"到"这没什么大不了的-用他们的时候它更方便不是。"

此。

具体理由(最好用一个例子)

  • 为什么全球变量是危险的
  • 当全球变量 应该 可用的替代品
  • 什么替代品的存在对于那些倾向于使用全球变量不恰当的

虽然这是主观的,我会选一个的答案(即到我最好的表示爱恨关系的每一个开发商应有globals)和社会投他们的正下方。

我相信这是重要的新手要有这样的参考,但请不要混乱,如果另一回答存在的大致类似于你的-添加评论或编辑的其他人的回答。

-亚当

有帮助吗?

解决方案

变量,应该总是有更小的范围可能的。该论点的背后,是的每一次增加的范围,你有更多的代码这可能改变,因此更加复杂的是诱导的解决方案。

因此很清楚的是,避免使用全球变量是首选,如果设计和执行自然允许。由于这个我不喜欢使用全球变量,除非它们是真正需要的。

我不能同意"永不"的声明,像任何其他概念的全球变量是一个工具,应当在需要时使用。我宁愿使用全球变量比使用某些人工结构(如通过指针周围),这只会掩盖真实意图。好的例子,全球变量使用的单一模式实现,或注册的访问中嵌入式系统。

在如何实际检测过量使用的全球变量:检查、检验、检验。每当我看到一个全球性的可变我必须问自己:是,真正需要的在全球范围?

其他提示

只有这样你才能使全球变量的工作是给他们的名字,保证它们是独特的。

这个名字通常具有前缀相关的一些"模块"或收集的功能对于全球变是特别关注或者有意义的。

这意味着变量"属于"这些职能--这是他们的一部分。事实上,全球通常可以"包裹"与一个小的功能,它与其他职能--在一样 .h 文件同一名称的前缀。

奖金。

当你做的时候,突然,它不是 真的 全球任何的更多。它现在的一部分,某些模块的有关职能。

这个可以 总是 要做。有一点思考每一个前的全球变可以分配给某些收藏的功能,分配给一个具体 .h 文件,并且孤立的功能,能让你改变不会破坏任何东西.

而不是说"永不使用全球变量",你可以说"分配全球变量的责任的一些模块,其中最有意义。"

考虑本公案:"如果范围足够窄,一切都是全球性的".

它仍然是非常可能在这个年龄以需要编写一个非常快速的实用程序做一个一次性的工作。

在这种情况下,能源需要创建安全的访问变量大于所能保存的通过调试的问题,在这样一个小的实用工具。

这是唯一的情况下,我认为随便哪里,全球变量是明智的,并且它是比较少见的。有用,新颖的程序如此之小,他们可以保持完全的大脑内的短期记忆越来越频繁,但他们仍然存在。

事实上,我可以大胆地权利要求,如果该程序是不是这个小,那么全球变量,应该是非法的。

  • 如果变量将永远不会改变,那么它是一个恒定不变量。
  • 如果可变要求的普遍访问,然后两个子程序应该存在于获取和设置,他们应该是同步的。
  • 如果程序启动小,并可能是更大的后面,那么代码,如果该程序是大型的今天,取消全球变量。不是所有的程序将增长!(尽管当然,假定该程序是否愿意扔掉码的时间。)

全球变量在C是有用的代码的更多的可读如果一个变量,需要通过多种方法(而不是通过可变成各个方法)。然而,他们是危险的,因为所有地点有能力修改,可变的,使得它有可能难以追查的错误。如果你必须使用全球变量,始终确保它只是直接修改的方法之一和所有其它的呼叫者使用这一方法。这将使它更容易调试有关的问题的变化,变量。

当你不担心线的安全代码:使用他们,无论是有意义的,换句话说,无论是有意义的表达的东西作为一个全球性的状态。

当你的代码可以是多线程:不惜一切代价避免。抽象的全球变量纳入工作队或其他一些线的安全结构,或者,如果绝对必要,他们包裹在锁,同时铭记,这些都是有可能的瓶颈程序。

我来自"永不"营地,直到我开始工作,在国防行业。有一些行业标准,需要软件使用全球变量,而不是动态(malloc在C)存储器。我有重新思考我的方式来动态内存分配一些项目,我的工作。如果你能保护"全球性"记忆与适当的信号灯,线,等等。然后这可能是一个可接受的方式存储管理。

代码复杂性不是唯一的优化的关切。对于许多应用,表现优化有一个更大优先事项。但更重要的是,使用全球变量可大幅度地减少代码复杂性,在许多情况下。有许多,也许是专业的,在哪些情况下全球变量不仅是一个可接受的解决方案,但是优选的。我最喜欢的专门的例子是他们的使用之间提供通信的主线应用程序,与一个声音回呼功能运行的实时线。

这是误导性的建议,全球变量是一个责任在多应用程序作任何变,而不论的范围,是一个潜在的赔偿责任,如果它是暴露在变化对超过一个线程。

使用全球变量谨慎。数据结构应尽可能使用组织和隔离使用的全球命名空间。

变量范围内援用程序非常有益的保护--但是它可以有成本。我来写关于全球变量今晚因为我是一名经验丰富的目标-C程序员常常感到沮丧的障碍向对象的地方在数据访问。我认为,反全球狂热主要来自年轻的,理论的拥有经验的程序员主要是面向对象的Api在隔离不了深深的实践经验的系统一级Api及其相互作用在应用程序开发。但我不得不承认我感到沮丧,当供应商使用空间草率.几个linux发行版了"PI"和"TWOPI"预定在全球范围内,例如,打破了我的个人代码。

你需要考虑在什么情况下的全球变量将被用作。在未来你会想要这个代码复制。

例如,如果您使用的是一座系统内访问的资源。在未来将要访问一个以上的这些资源,如果答案是肯定的我会远离globals在第一位这样一个主要重构将不需要的。

它是一个工具,像任何其他通常使用过度,但我不认为他们是邪恶的。

例如,我有一个计划,真正的行为就像一个在线数据库。数据存储器中存储但其他程序可以操纵。有的内部程序的行为就像存储程序,并触发一个数据库。

这个程序有数以百计的全球变量,但如果你想一想什么是一个数据库,但数量庞大的全球变量。

这个程序已经使用了大约十年来通过的许多版本,它从来没有被一个问题,我会再次这样做在一分钟。

我会承认,在这种情况下,全球vars对象具有使用的方法是改变对象的状态。因此,追踪谁改变的目的在调试时是不是一个问题,因为我总是可以设置一个断点的例行程序,更改的目的状态。甚至更简单我只是打开的建立在记录日志的变化。

全球变量时,应使用多种功能的需要访问的数据或写信给一个对象。例如,如果必须通过数据或参照多种功能,例如一个单一登录文件、连接的游泳池,或硬件的参考,即需要访问的跨应用程序。这防止了非常长的函数声明和大拨款的重复的数据。

你通常应该 使用全球变量,除非绝对必要的,因为全球变量只是清理了当明确告知这样做或程序结束。如果你正在运行一个多线应用的、多功能可以写信给该变量相同的时间。如果你有一个错误,追踪,错误下可以更困难,因为你不知道它的功能是变化的变量。你还遇到的问题命名的冲突,除非你使用一个命名的公约》明确给全球变量的一个独特的名称。

当你宣布的常数。

我可以想到的几个原因:

调试/测试目(预警-没有测试过这个代码):

#include <stdio.h>
#define MAX_INPUT 46
int runs=0;
int fib1(int n){
    ++runs;
    return n>2?fib1(n-1)+fib1(n-2):1;
};
int fib2(int n,int *cache,int *len){
    ++runs;
    if(n<=2){
        if(*len==2)
            return 1;
        *len=2;
        return cache[0]=cache[1]=1;
    }else if(*len>=n)
        return cache[n-1];
    else{
        if(*len!=n-1)
            fib2(n-1,cache,len);
        *len=n;
        return cache[n-1]=cache[n-2]+cache[n-3];
    };
};
int main(){
    int n;
    int cache[MAX_INPUT];
    int len=0;
    scanf("%i",&n);
    if(!n||n>MAX_INPUT)
        return 0;
    printf("fib1(%i)==%i",n,fib1(n));
    printf(", %i run(s)\n",runs);
    runs=0;
    printf("fib2(%i)==%i",n,fib2(n,&cache,&len));
    printf(", %i run(s)\n",runs);
    main();
};

我用范围的变量fib2,但这是一个多方案,其中globals可能是有用的(纯粹的数学的职能需要存储的数据,以避免把永远).

使用的程序只有一次,(例如一个竞赛),或者当发展时需要缩短

globals是有用的,因为类型的常数,其中一个功能的地方需要*int而不是int。

我通常避免globals如果我打算使用的程序对于超过一天。

  • 时不使用: 全球变量是危险的,因为只有这样,才能知道如何全球变量变化是以跟踪整的源代码内。c文件内,它们所宣布的(或者所有。c文件,如果是外部)。如果你的代码越野车,你要搜索整个来源文件(s)来看看它的功能改变它,当。它是一场噩梦调试时出了问题。我们常常想当然的聪明才智的后面这一概念的地方变量地走出去的范围- 很容易追踪
  • 当使用: 全球变量时,应使用其利用不会过掩盖,在那里使用当地的变量是过于复杂的地步,它妥协的可读性。通过这个,我的意思是必要的具有添加一个附加参数的函数和返回并通过的指针周围,除其他事项。三个经典的例子:当我使用的流行和推栈-这是之间共享职能。当然我可以使用当地的变量,但然后我就会通过的指针围作为附加参数。第二个经典的例子中可以找到K&R"C编程语言中的"他们在那里定义 getch()ungetch() 功能分享一个全球性缓冲器阵列。再次,我们不需要使它成为全球性的,但是增加的复杂性值得在其很难搞砸了使用缓冲区的?第三实例是东西,你会发现在嵌入空间之间的Arduino业余爱好者。很多职能的主 循环 功能的所有分享的 米利斯() 功能是瞬时的时间函数时调用。因为时钟的速度不是无限的, 米利斯()有所不同 在一个单独的循环。让它不断,快照时间 之前 每一个循环,并将其保存在一个全球性的变量。时间快照现在将同访问时通过的许多职能。
  • 备选方案: 不多。坚持当地范围尽可能的,尤其是在项目开始时,而不是反之亦然。作为该项目增长的如果你觉得复杂性,可以降低使用全球变量,那么这样做,但仅仅如果它符合要求的点有两个。记住,使用当地范围和具有更复杂的代码是小恶相比,不负责任地使用全球变量。

我在我的"永不"营地在这里;如果你需要一个全球性可变的,至少使用一个 单独的图案.这样一来,你从中获益的懒惰的实例,你不要弄乱的全球命名空间。

全球常数是有用的-你得到更多类型的安全比预处理器宏它仍然只是作为容易改变的价值,如果你决定你需要的。

全球变量有一些用途,例如,如果操作的许多部分的程序取决于特定国家的国家机。只要你限数量的地方,可以修改的变量跟踪的错误,涉及它是不是太坏的。

全球变成为危险的几乎尽快创建一个以上的螺纹。在这种情况下你真的应该将范围限制(至多)一个文件,全球(通过宣布它静态)可变和气剂/二传方法,保护它的多个访问在哪里,可能是危险的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top