全局变量_全局变量管理 - CSDN
全局变量 订阅
全局变量是编程术语中的一种,源自于变量之分。变量分为局部与全局,局部变量又可称之为内部变量。由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用。全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。 展开全文
全局变量是编程术语中的一种,源自于变量之分。变量分为局部与全局,局部变量又可称之为内部变量。由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用。全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。
信息
外文名
Global variables
变    量
在函数外部定义
也称为
外部变量
中文名
全局变量
目    的
一般应作全局变量声明
全局变量英文
Global variables例如:从上例可以看出a、b、x、y 都是在函数外部定义的外部变量,都是全局变量。但x,y 定义在函数f1之后,而在f1内又无对x,y的说明,所以它们在f1内无效。 a,b定义在源程序最前面,因此在f1,f2及main内不加说明也可使用。全局变量是使用相同的内存块在整个类中存储一个值.全局变量extern与staticextern在其他源程序中也可以使用;static只能在本程序中使用。
收起全文
  • C语言中全局变量的定义与调用

    万次阅读 2014-09-11 11:28:04
    1. 谭浩强 书中对‘全局变量’的定义  在函数内定义的变量是局部变量,而在函数外定义的变量叫做外部变量,外部变量是全局变量全局变量可以为本文件中其他函数所共用它的有效范围从定义变量的位置开始到本源文件...

    1. 谭浩强 书中对‘全局变量’的定义

        在函数内定义的变量是局部变量,而在函数外定义的变量叫做外部变量,外部变量是全局变量。全局变量可以为本文件中其他函数所共用它的有效范围从定义变量的位置开始到本源文件结束。

        建立全局变量的作用是增加了函数间数据联系的渠道。

    2.  谭浩强 书中对‘全局变量’的声明

        用extern声明:

           如果外部变量不在文件的开头定义,其有效的作用范围只能从定义点到文件结束。如果在定义点之前的函数想引用该外部变量,则应该在应用之前用关键字extern对该变量作‘外部变量声明’。表示该变量是一个已经定义了的外部变量。有了此声明,就可以从声明处起,合法的调用该外部变量。

     

          

    int  A=13, B=-8;

    ....

    main()

    {

        extern int A,B;//也可以写成extern A,B;

        ....

        用static声明:

            有时在程序中希望某些外部变量只限于被本文件引用,而不能被其他文件引用。这时就可以在定义外部变量时在其前面加一个static声明。此时的外部变量也成为静态全局变量。

           

    static int A;

    3. 需要注意的地方

       外部变量的定义和声明是不同的。外部变量的定义只能有一次,它的位置在所有函数之外,而统一文件中的外部变量的声明可以有多次,它的位置可以在函数之内,也可以在函数之外。系统根据外部变量的定义,而不是声明,分配存储单元。对外部变量的初始化,只能在定义时进行,而不能在声明中进行

    展开全文
  • 全局变量的定义和使用

    万次阅读 2018-07-05 18:46:36
    extern说明符说明该变量可作为一个外部变量使用,在某个文件中定义了该变量后,使用变量时加上extern说明符,然后添加头文件。(在头文件中定义不加extern,在源文件使用前加extern... //定义全局变量 int externNu...

    extern说明符说明该变量可作为一个外部变量使用,在某个文件中定义了该变量后,使用变量时加上extern说明符,然后添加头文件。(在头文件中定义不加extern在源文件使用前加extern再定义。否则出错)
    头文件和源文件

    //332.h
    #include<iostream>
    using namespace std;
    int num; //定义全局变量
    int externNum;//外部变量
    void ShowAddress()
    {
        cout<<"在文件中地址为"<<&externNum<<endl;
        cout<<"在文件中地址为"<<&num<<endl;
    
    }
    #include"332.h"
    extern int externNum;
    int main()
    {
        cout<<"在主函数中地址为"<<&externNum<<endl;
        cout<<"在主函数中地址为"<<&num<<endl;
        ShowAddress();
        return 0;   
    }

    这里写图片描述

    由结果可知,使用文件包含或使用extern的变量在内存中的存储位置是相同的,因此属于同一个变量。这些变量可以作为整个程序的共享变量来使用,从而方便文件之间的数据加交互。
    注意:在使用extern定义变量时,需要和原变量的类型保持一致,否则某些编译器会认为是不同的变量。

    展开全文
  • 全局变量

    千次阅读 2019-05-09 22:06:51
    定义在函数内部的变量叫做局部变量,定义在函数外部的变量叫做全局变量。局部变量只能在该函数内部才能使用,而全局变量可以被整个C语言中所有的函数所公用,他的作用范围是从定义的位置开始一直到整个C语言程序结束...

    定义在函数内部的变量叫做局部变量,定义在函数外部的变量叫做全局变量。局部变量只能在该函数内部才能使用,而全局变量可以被整个C语言中所有的函数所公用,他的作用范围是从定义的位置开始一直到整个C语言程序结束。所以根据定义位置的不同,全局变量的作用域范围不同。

    在一个函数中即可以使用本函数的局部变量,也可以使用有效的全局变量。

    #include<stdio.h>
    int a = 10; //全局变量
    int main(void)
    {
    	int a = 5; // 定义一个同名的局部变量
    	printf("a = %d\n", a);
    	return 0;
    }
    

    在这里插入图片描述
    所以定义变量的时候局部变量和全局变量最好不要重名。此外,如果局部变量未初始化,那么系统会自动将“-585993460”放进去,但是如果全局变量未初始化,那么系统会自动将其初始化为0,他们的这个区别主要源自于他们存储空间的不同,局部变量是栈中分配的,而全局变量是在静态存储区中分配的。只要是在静态存储区中年分配的,如果未初始化则系统都会自动将其初始化为0,下面我们来验证一下。

    #include<stdio.h>
    int a; // 全局变量
    int add(int n);
    int main(void)
    {
    	int b;
    	printf("b = %d\n", b);
    	printf("a = %d\n", a);
    	add(b);
    	return 0;
    }
    int add(int n)
    {
    	printf("n = %d\n", n);
    	return n + 1;
    }
    

    在这里插入图片描述

    #include<stdio.h>
    int a; // 全局变量
    int add(int n);
    int main(void)
    {
            int b;
            printf("b = %d\n", b);
            printf("a = %d\n", a);
            add(b);
            return 0;
    }
    int add(int n)
    {
            int c;
            printf("c = %d\n", c);
            return n + 1;
    }
    

    在这里插入图片描述
    设置全局变量的作用域是增加函数间数据联系的渠道。因为全局变量可以被多个函数所公用,这样就可以不通过实际参数和形参向被调函数传递数据。所以利用全局变量可以减少函数中实际参数和形式参数的个数,从而减少内存空间传递数据时的时间消耗。但是除非是迫不得已,否则不建议使用全局变量。

    我们暂时不说静态变量。

    展开全文
  • 全局变量的声明、定义及用法

    千次阅读 2019-02-27 15:43:49
    全局变量的声明、定义及用法 文章目录全局变量的声明、定义及用法1. 编译单元(模块)2. 声明和定义3. extern 作用4. 全局变量(extern)4.1 如果直接将声明和定义都放在头文件中会如何?5. 静态全局变量(static)6. 全局...

    全局变量的声明、定义及用法


    转载自https://blog.csdn.net/candyliuxj/article/details/7853938
    转载自https://blog.csdn.net/chaipp0607/article/details/59110710

    2019年2月27日 15:27:44修改

    1. 编译单元(模块)

    在 VC 或 VS 上编写完代码,点击编译按钮准备生成 exe 文件时,编译器做了两步工作:

    • 将每个 .cpp(.c) 和相应的. h 文件编译成 obj 文件;
    • 将工程中所有的 obj 文件进行 LINK,生成最终 .exe 文件。

    那么,错误可能在两个地方产生:

    • 编译时的错误,这个主要是语法错误;
    • 链接时的错误,主要是重复定义变量等。

    编译单元指在编译阶段生成的每个 obj 文件。

    一个 obj 文件就是一个编译单元。
    一个 .cpp(.c) 和它相应的 .h 文件共同组成了一个编译单元。
    一个工程由很多编译单元组成,每个 obj 文件里包含了变量存储的相对地址等。

    2. 声明和定义

    函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可保证你的程序编译通过;函数或变量在定义时,它就在内存中有了实际的物理空间。

    如果你在编译单元中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,在链接时也会报错,因为程序在内存中找不到这个变量。

    函数或变量可以声明多次 (如果是变量多次声明需要加 extern 关键字),但定义只能有一次。

    对于变量而言,在同一个文件里面,很少使用声明这个说法,一般没有人去说我要声明一个变量,然后定义这个变量。或者说,同一文件下声明与定义没有明显的区别。就好比 int a;我们可以说这是一个声明,也可以说这是一个定义,因为当程序执行到这句话的时候就完成了内存分配。数据类型,变量名,对应的内存单元就已经明确。
    而 int a =1; 就完成了初始化,因为它明确了内存单元里到底存放什么样的数据。

    在同一个工程,在多个文件中变量的声明和定义才有区别。比如说在 first.c 文件中先定义了一个全局变量 int a; 我在 second.c 中要访问这个 a ,这时我们需要在 second.c 这个文件中用 extern 声明一下。这是常规写法,我们有更好的写法,在下面介绍。

    3. extern 作用

    • 当它与 “C” 一起连用时,如 extern “C” void fun(int a, int b);,则编译器在编译 fun 这个函数名时按 C 的规则去翻译相应的函数名而不是 C++ 的。

    • 当它不与 “C” 在一起修饰变量或函数时,如在头文件中,extern int g_nNum;,它的作用就是声明函数或变量的作用范围的关键字,其声明的函数和变量可以在本编译单元或其他编译单元中使用。

    即 B 编译单元要引用 A 编译单元中定义的全局变量或函数时,B 编译单元只要包含 A 编译单元的头文件即可,在编译阶段,B 编译单元虽然找不到该函数或变量,但它不会报错,它会在链接时从 A 编译单元生成的目标代码中找到此函数。

    4. 全局变量(extern)

    有两个以上文件都需要使用共同的变量,我们将这些变量定义为全局变量。比如,res.h 和 res.cpp 分别来 声明定义 全局变量,其他文件需要使用全局变量时,只需要包含 res.h 即可,同时这也是 推荐的写法

    下面是示例代码,只为演示全局变量的用法,不保证算法完备性:

    /**********res.h声明全局变量************/
    #pragma once
     
    #include <QSemaphore>
     
    const int g_nDataSize = 1000; // 生产者生产的总数据量
    const int g_nBufferSize = 500; // 环形缓冲区的大小
     
    extern char g_szBuffer[]; // 环形缓冲区
    extern QSemaphore g_qsemFreeBytes; // 控制环形缓冲区的空闲区(指生产者还没填充数据的区域,或者消费者已经读取过的区域)
    extern QSemaphore g_qsemUsedBytes; // 控制环形缓冲区中的使用区(指生产者已填充数据,但消费者没有读取的区域)
    /**************************/
    

    上述代码中g_nDataSize、g_nBufferSize为全局常量,其他为全局变量。

    /**********res.cpp定义全局变量************/
    #pragma once
    #include "res.h"
     
    // 定义全局变量
    char g_szBuffer[g_nBufferSize];
    QSemaphore g_qsemFreeBytes(g_nBufferSize);
    QSemaphore g_qsemUsedBytes;
    /**************************/
    

    在其他编译单元中使用全局变量时只要包含其所在头文件即可。

    /**********在consumerthread.cpp使用全局变量************/
    #include "consumerthread.h"
    #include "res.h"
    #include <QDebug>
    
    void ConsumerThread::run() {
         for (int i = 0; i < g_nDataSize; i++) {
              g_qsemUsedBytes.acquire();              
              qDebug()<<"Consumer "<<g_szBuffer[i % g_nBufferSize];
              g_szBuffer[i % g_nBufferSize] = ' ';
              g_qsemFreeBytes.release();
             
         }
         qDebug()<<"&&Consumer Over";
    }
    /**************************/
    

    为了程序的简洁和清爽,我们通常将变量声明放在头文件中,需要使用的时候只需要包含头文件即可,如果不这样做,当涉及到的全局变量变多时,我们要做一大堆繁琐的声明工作。

    4.1 如果直接将声明和定义都放在头文件中会如何?

    效果看起来是这样:

    /**********res.h声明全局变量************/
    #pragma once
     
    #include <QSemaphore>
     
    const int g_nDataSize = 1000; 
    const int g_nBufferSize = 500; 
     
    char g_szBuffer[]; 
    QSemaphore g_qsemFreeBytes; 
    QSemaphore g_qsemUsedBytes; 
    /**************************/
    

    这样做非常不妙,如果你的工程简单到只有一个头文件和一个源文件,那么没问题。但是当工程变得复杂时,很容易出现重定义错误。

    看到其他的说法是,即使在 res.h 中加 #pragma once,或 #ifndef 也会出现重复定义,因为每个编译单元是单独的,都会对它各自进行定义),那么 res.h 声明的其他函数或变量,你也就无法使用了,除非也都 extern 修饰,这样太麻烦,所以还是推荐使用 .h 中声明,.cpp 中定义的做法

    但是我个人的验证是 #pragma once,或 #ifndef 可以有效防止重定义的问题,遇到使用 #ifndef 也会提示重定义的情况是 #ifndef 仅对代码片段有效,在 #ifndef 范围外的代码自然会提示重定义。

    这里先保留意见,总之,.h中声明,.cpp中定义的做法是最稳妥的。

    5. 静态全局变量(static)

    注意使用 static 修饰变量,就不能使用 extern 来修饰,即 static 和 extern 不可同时出现。

    static 修饰的全局变量的声明与定义同时进行,即当你在使用 static 声明了全局变量,同时它也被定义了。

    static 修饰的全局变量的作用域只能是本身的编译单元。在其他编译单元使用它时,只是简单的把其值复制给了其他编译单元,其他编译单元会另外开个内存保存它,在其他编译单元对它的修改并不影响本身在定义时的值。即在其他编译单元 A 使用它时,它所在的物理地址,和其他编译单元 B 使用它时,它所在的物理地址不一样,A 和 B 对它所做的修改都不能传递给对方。

    多个地方引用静态全局变量所在的头文件,不会出现重定义错误,因为在每个编译单元都对它开辟了额外的空间进行存储。

    下面是示例程序,同样只做演示,不保证算法完备性:

    /***********res.h**********/
    static char g_szBuffer[6] = "12345";
    /************************/
    
    /***********test1.cpp**********/
    #include "res.h"
    
    //fun1对g_szBuffer中的内容进行修改
    void fun1() { 
         for (int i = 0; i < 6; i++) {
              g_szBuffer[i] = 'a' + i;
         }
         cout<<g_szBuffer<<endl;
    }
    /************************/
    
    /***********test2.cpp**********/
    #include "res.h"
    
    //fun2对g_szBuffer原样打印 
    void fun2() {
         cout<<g_szBuffer<<endl;
    }
    /************************/
    
    /***********main.cpp**********/
    #include "test1.h"
    #include "test2.h"
     
    int main() {
         fun1();
         fun2();
     
         system("PAUSE");
         return 0;
    }
    /************************/
    

    按我们的直观印象,认为 fun1() 和 fun2() 输出的结果都为相同,可实际上 fun2() 输出的确是初始值。然后我们再跟踪调试,发现 test1、test2 中 g_szBuffer 的地址都不一样,这就解释了为什么不一样。

    注:一般定义 static 全局变量时,都把它放在 .cpp 文件中而不是 .h 文件中,这样就不会给其他编译单元造成不必要的信息污染。

    6. 全局常量(const)

    const单独使用时,其特性与static一样(每个编译单元中地址都不一样,不过因为是常量,也不能修改,所以就没有多大关系)。

    const 与 extern 一起使用时,其特性与 extern 一样。

    extern const char g_szBuffer[];      //写入 .h中
    const char g_szBuffer[] = "123456"; // 写入.cpp中
    
    展开全文
  • 不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,全局变量也是存放于程序的全局变量区域,所以它们的生命周期是从程序开始到程序结束。 它们的作用域决定于它被存放和定义的位置。
  • C语言全局变量定义方法

    万次阅读 2019-07-09 16:05:46
    C语言全局变量定义方法     今天调试系统的时候,需要定义几个全局位变量,定义好后一编译,发现错误一大堆,错误基本都是位变量定义时产生的。以前也定义过全局变量啊,但是先前怎么没错误?...
  • 全局对象和全局变量

    千次阅读 2018-01-09 10:48:00
    概念:所有属性都可以在程序的任何地方访问,即全局变量。在JavaScript中,通常window是全局对象,而Node.js的全局对象是global,所有全局变量都是global对象的属性,如:console、process等。 一、全局对象与全局...
  • 全局变量的优缺点及为什么要少用全局变量

    万次阅读 多人点赞 2019-03-27 22:06:58
    全局变量 对于程序员来说,是程序 “同步”的一种最方便的 方式,我相信大多数的程序员 刚开始都是使用全局变量来实现“同步”操作的,但是随着我们 编程理念的升华,我们会发现,原来全局变量不是我们想象的只有...
  • Python定义全局变量的用法

    万次阅读 2018-08-15 15:07:07
    全局变量是编程语言中常见的一种变量,通过全局定义,可以是某对象函数创建,也可以是本程序任何位置创建,能够被本程序中的所有对象或函数进行引用,全局变量的定义有利于程序的变量共享,简化了添加和修改的程序。...
  • python中全局变量与局部变量

    万次阅读 2019-03-01 15:27:17
    python中全局变量与局部变量 标签: python 局部变量就是定义在一个函数体内部的变量 全局变量是定义在外面的变量 比如: a = 1 def f(): b = 2 其中a就是全局变量,而b是局部变量。局部变量只在函数体内部...
  • Java静态全局变量全局变量的区别

    千次阅读 2019-01-16 09:58:55
    Static全局变量与普通的全局变量有什么区别? 答:  全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上...
  • python中全局变量和局部变量详解

    万次阅读 多人点赞 2018-11-13 14:08:42
    python中全局变量和局部变量的最大区别在于局部变量只能通过函数去访问,而全局变量可以直接访问。 !!! 我们先来看一个最简单的例子,事实上这并不是一个真正的全局变量,只是在类中的一个变量。 !!! 我们...
  • 1.C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用...当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。2>静态局部变量具有局部作用域,它只被初始化一次,自从第一次被
  • 【C++ - 21】局部变量和全局变量的区别

    万次阅读 多人点赞 2019-05-26 23:07:47
    局部变量可以与全局变量重名,但是局部变量会屏蔽全局变量。要使用全局变量,需要使用::。在函数体内引用变量会用到同名的局部变量而不是全局变量,对于一些编译器来说,在同一个函数体内可以定义多个同名的局部变量...
  • 写在前面:花了近2个小时,就为了弄懂一下Objective-C中的全局变量和static静态全局变量的区别,好吧,程序猿没有废话,开门见山。首先,网上查了一下全局变量和静态全局变量的总结,觉得这个总结不错:全局变量与...
  • 全局变量和静态全局变量

    千次阅读 2019-04-15 00:01:34
    全局变量和局部变量是从变量的作用域的角度划分。 静态变量和动态变量是从变量的内存分配的角度划分。 全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同,区别在于非...
  • matlab:使用全局变量

    万次阅读 2020-04-02 20:01:48
    简介全局变量(global variable)是变量的一种类型,区别于局部变量。若将一个变量声明为全局变量,则它所占的内存为全局内存,而不是本地工作区内存。因此全局变量就可以被所有工作区访问,修改。实例理解在函数间...
  • 全局变量危害小结

    千次阅读 2020-01-02 10:26:21
    全局变量危害小结长期占用内存全局变量生命周期长,程序运行期一直存在,始终占有那块存储区;难以定位修改全局变量是公共的,全部函数都可以访问,难以定位全局变量在哪里被修改,加大了调试的难度;使函数理解使用...
  • Python的全局变量和局部变量

    万次阅读 多人点赞 2018-05-13 13:38:40
    学编程的总离不开全局变量和局部变量,那么,首先我们要知道局部变量和全局变量的定义: 局部变量:定义在函数内部的变量称为局部变量,他的作用域范围为函数内,也就是出了函数外就无效。举个简单的例子:葫芦娃在...
  • 变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态 存储区域,局部变量存放在内存的栈区。 按作用域分,全局变量在整个...
1 2 3 4 5 ... 20
收藏数 991,043
精华内容 396,417
关键字:

全局变量