精华内容
下载资源
问答
  • C全局变量

    2014-03-04 21:27:50
    关于C语言多文件编写的一点小小总结 在多文件编写中,变量,尤其的全局变量的定义和引用显得不那么精简。...加入定义了10个全局变量,而在具体一个*.c文件中我只用其中一个。如果用include把全局变量全都包含进来。
    关于C语言多文件编写的一点小小总结
    在多文件编写中,变量,尤其的全局变量的定义和引用显得不那么精简。很多人可能会想,把全局变量放在一个*.h文件中,然后在以后的调用中只要include一下不就可以了?想想也有道理,include不就是把*.h原封不动的复制过来吗?但是,这样存在一个问题。加入定义了10个全局变量,而在具体一个*.c文件中我只用其中一个。如果用include把全局变量全都包含进来。那利用率不就才是10%吗。而且C语言常用于嵌入式,如果每个文件都include一个全局变量头文件,那么这些变量就被分配一次内存,这对嵌入式来说肯定是致命的;另外,如果有很多个文件都include了全局变量的头文件,编译器要跟踪每一个文件对其中一个变量的更改,这对编译器来说也是吃不消的。
          所以便有了*.c和*.h的区别。
          很多人都知道声明和定义的区别——一个分配内存,一个不分配内存,而且函数的声明和定义更是显而易见,但是对于变量的声明和定义,就显得有些模糊不清。由于如上所述的种种原因,C语言中全局变量放在*.c文件,而不放在*.h文件。这样一来,*.h文件好像无用武之地了,非也。我们经常见到#include "****.h",但有谁见过#include "***.c"吗?所以*.h文件用来声明,*.c文件用来实现,在调用处用extern声明。
            1、普通变量定义成全局变量
            如果是普通类型,完全可以不用*.h文件,直接在*.c文件中定义,在调用文件处用extern 声明,因为对于普通类型,编译器是可以识别的。比如在一个 my.c文件中,我定义了char name[10];那么在别的文件中只要用extern char name[](由于是声明,一位数组可以省略大小,但不建议用指针,比较指针和数组是两回事)外部声明就可以了,告诉编译器这个变量我已经定义过了,具体怎样,你慢慢找吧。这符合常理,因为char是编译器能自主识别的类型。
            2、自定义结构体类型定义成全局变量
            不同于普通类型,如果不预先通知编译器,编译器是不会识别你自定义的类型的。这个时候,*.h文件便出现了。不是定义结构类型不占内存吗?那好,我大结构体的定义放在*.h文件中,这样一来,无论你incude无数次,内存都不会被占用的。而且这样还有个好处,在别的文件中可以include这个*.h文件,这样,在这个文件中,编译器就可以识别你的自定义类型了,目的不就达到了?  假如我在global.h中定义了
    typedef struct _POSITION
    {
            int x;
            int y;
    }POSITION;
    那么我可以在一个global.c文件中实现全局变量的定义,不过要include那个*.h文件,比如
    /* ***global.c ******* */ 
    include “global.h”
    POSITION current,;  
    这样就定义了cunrrent这个变量,在别的文件中引用这个变量时,只要extern POSITION current;进行声明,然后就可以用了,不过这个文件也还得include "global.h" 因为如果不包含,在这个文件中是不识别POSITION类型的。
    展开全文
  • 数据段:数据段存的是数,像全局变量就是存在数据段的代码段:存的是程序代码,一般是只读的。栈(stack):先进后出。C语言中局部变量就分配在栈中。局部变量 普通的局部变量定义的时候直接定义或者在前面加上...

    f264732c66dd7e3877a3678d9e7a044a.png

    基本概念: 作用域:起作用的区域,也就是可以工作的范围。

    代码块:所谓代码块,就是用{}括起来的一段代码。

    数据段:数据段存的是数,像全局变量就是存在数据段的

    代码段:存的是程序代码,一般是只读的。

    栈(stack):先进后出。C语言中局部变量就分配在栈中。

    局部变量

      普通的局部变量定义的时候直接定义或者在前面加上auto

    void func1(void)
    {
    int i = 1;
    i++;
    printf("i = %d.n", i);
    }
    局部变量i的解析:
    在连续三次调用func1中,每次调用时,在进入函数func1后都会创造一个新的变量i,
    并且给它赋初值1,然后i++时加到2,
    然后printf输出时输出2.然后func1本次调用结束,
    结束时同时杀死本次创造的这个i。这就是局部变量i的整个生命周期。
    下次再调用该函数func1时,又会重新创造一个i,经历整个程序运算,
    最终在函数运行完退出时再次被杀死。

    静态局部变量(static) 静态局部变量定义时前面加static关键字。

    总结:

    1、静态局部变量和普通局部变量不同。静态局部变量也是定义在函数内部的,静态局部变量定义时前面要加static关键字来标识,静态局部变量所在的函数在多调用多次时,只有第一次才经历变量定义和初始化,以后多次在调用时不再定义和初始化,而是维持之前上一次调用时执行后这个变量的值。本次接着来使用。

    2、静态局部变量在第一次函数被调用时创造并初始化,但在函数退出时它不死亡,而是保持其值等待函数下一次被调用。下次调用时不再重新创造和初始化该变量,而是直接用上一次留下的值为基础来进行操作。

    3、静态局部变量的这种特性,和全局变量非常类似。它们的相同点是都创造和初始化一次,以后调用时值保持上次的不变。不同点在于作用域不同

    全局变量 定义在函数外面的变量,就叫全局变量。

    普通全局变量 普通全局变量就是平时使用的,定义前不加任何修饰词。普通全局变量可以在各个文件中使 用,可以在项目内别的.c文件中被看到,所以要确保不能重名。

    静态全局变量 静态全局变量就是用来解决重名问题的。静态全局变量定义时在定义前加static关键字, 告诉编译器这个变量只在当前本文件内使用,在别的文件中绝对不会使用。这样就不用担心重名问题。所以静态的全局变量就用在我定义这个全局变量并不是为了给别的文件使用,本来就是给我这个文件自己使用的。

    跨文件引用全局变量(extern) 就是说,你在一个程序的多个.c源文件中,可以在一个.c文件中定义全局变量g_a,并且可以在别的另一个.c文件中引用该变量g_a(引用前要声明)

    函数和全局变量在C语言中可以跨文件引用,也就是说他们的连接范围是全局的,具有文件连接属性,总之意思就是全局变量和函数是可以跨文件看到的(直接影响就是,我在a.c和b.c中各自定义了一个函数func,名字相同但是内容不同,编译报错。)。

    局部变量和全局变量的对比:
    1、定义同时没有初始化,则局部变量的值是随机的,而全局变量的值是默认为0.
    2、使用范围上:全局变量具有文件作用域,而局部变量只有代码块作用域。
    3、生命周期上:全局变量是在程序开始运行之前的初始化阶段就诞生,到整个程序结束退出的时候才死亡;而局部变量在进入局部变量所在的代码块时诞生,在该代码块退出的时候死亡。
    4、变量分配位置:全局变量分配在数据段上,而局部变量分配在栈上。

    //static

    #include <stdio.h>
    
    
    void func1(void);
    void func_static(void);
    void func_static2(void);
    void func_global(void);
    void func_register(void);
    
    int g_a = 1;
    
    
    int main(void)
    {
        //a = 4;            // 编译报错,未定义
        g_a = 5;            // 可以,因为g_a是全局变量,所以到处都可以用
    
        func1();        // i = 2
        func1();        // i = 2
        func1();        // i = 2
    
        func_static();    // a = 2
        func_static();    // a = 3
        func_static();    // a = 4
    
        func_static2();    // a = 4;
        func_static2();    // a = 7;
        func_static2();    // a = 10;
    
        func_global();    // g_a = 4;
        func_global();    // g_a = 7;
        func_global();    // g_a = 10;
    
        func_register();
        func_register();
        func_register();
    
    
    
    
    // 因为i是定义在函数func中的局部变量,所以i的作用域为代码块作用域,所以i只在func1
    // 函数内部有效,在func1外面是不能访问i的。所以这里i会无定义。
        //i = 5;        // error: ‘i’ undeclared (first use in this function)
    
        return 0;
    }
    
    
    void func1(void)
    {
        int i = 1;                // 普通的局部变量,auto可以省略的
        //auto int i = 0;            // 自动局部变量,其实就是普通局部变量
    
        i++;
    
        printf("i = %d.n", i);
    }
    
    void func_static(void)
    {
        static int a = 1;        // 静态的局部变量
    
        a++;
    
        printf("a = %d.n", a);
    }
    
    void func_static2(void)
    {
        static int a = 1;        // 静态的局部变量
    
        a += 3;
    
        printf("a = %d.n", a);
    }
    
    void func_global(void)
    {
        g_a += 3;
    
        printf("g_a = %d.n", g_a);
    }
    
    void func_register(void)
    {
        register int a = 1;        // 静态的局部变量
    
        a += 3;
    
        printf("a = %d.n", a);
    }

    //globle

    #include <stdio.h>
    
    
    int g_i = 13;
    
    
    // 实验结论:
    // 首先,main函数是一个程序运行最开始执行的东西,所有的其他函数都只能在main函数中被
    // 直接或者间接的调用才能被执行。main函数的执行其实就是整个程序的生命周期,main函数
    // 一return返回,整个程序就结束了。
    // 其次,全局变量的定义和初始化是在main函数运行之前发生的。
    int main(void)
    {
        printf("g_i = %d.n", g_i);
    
        return 0;
    }
    #include <stdio.h>
    
    
    void func_in_a(void);
    extern int g_a;                // 声明了一个int变量g_a
    //extern int g_b;
    
    void func_in_b(void)
    {
        printf("I am func in b.c.n");
    }
    
    
    int main(void)
    {
        printf("I am main in a.c.n");
        printf("I am main in a.c, g_a = %d.n", g_a);
        printf("I am main in a.c, g_a = %d.n", g_b);
    
    
        //func_in_b();        // 直接调用
    
        func_in_a();        // 间接调用
    
        return 0;
    }
    #include <stdio.h>
    
    
    
    void func_in_b(void);
    
    int g_a = 12;
    int g_b = 111;
    
    
    
    
    
    
    void func_in_a(void)
    {
    
        g_a = 24;
    
        printf("I am in func_in_a of a.c, g_a = %d.n", g_a);
        func_in_b();
    }
    
    /*
    // 定义错误
    // C语言中,定义函数都必须在外面,不能在一个函数里面定义别的函数
    // 所以没有局部函数,只有全局函数。
    
    void func1(void)
    {
        int a;
    
    
        void func2()
        {
            int b;
        }
    }
    
    */

    //最后两个分别为a.c b.c 文件目录为

    db18c60e974c0d55c541c74b2e401aab.png

    993d826f50b00e10eb1de16ea9e325b9.png

    C/C++学习资料分享交流群:1093776732 入群有全套学习视频资料电子书免费赠送!

    参考资料:

    物联网开发入门直播课 - 嵌入式/物联网-C语言编程基础www.makeru.com.cn嵌入式开发直播课 - 带你提升C编程能力www.makeru.com.cn
    b800b01214dca1c9d1e5e1f1eefed7b8.png
    嵌入式底层开发 - 夯实C语言,从小白到大牛的进阶之路!www.makeru.com.cn
    b800b01214dca1c9d1e5e1f1eefed7b8.png
    嵌入式开发直播课 - 嵌入式-指针www.makeru.com.cn
    展开全文
  • attiny10不能使用C全局变量,开发环境为avrstudio,最后只有
    attiny10不能使用C全局变量,开发环境为avrstudio,最后只有悲催地使用汇编了
    
    展开全文
  • C全局变量的用法

    2018-09-09 13:58:02
    extern的作用  1.当extern与C一起连用时,extern "C" void fun(int a);则告诉编译器编译时按照C的规则去编译函数名,若按照C++的...此时就是声明函数或全局变量的作用范围,extern类型声明和定义是要...

    extern的作用 

    1.当extern与C一起连用时,extern "C" void fun(int a);则告诉编译器编译时按照C的规则去编译函数名,若按照C++的规则编译很可能名字改变了,因为C++支持函数的ch重载。

    2.当extern不与C一起修饰变量或函数时,如在头文件定义 extern char  g_Char;此时就是声明函数或全局变量的作用范围,extern类型声明和定义是要分开的,在头文件进行声明,在本模块中进行定义,若有其他模块使用g_Char,只需要引用头文件就可以,它会在连接时从定义的模块的目标代码中找到引用的变量。

    3.有人习惯将全局变量的声明和定义放在一起,这样放在忘记了定义,extern char g_Char = 'g';这个时候相当于没有extern,然后把定义模块的定义去掉,当编译时若两个以上的地方都引用了定义全局变量的头文件则连接器在连接时发现li两个g_Char而出错误,若果非要在头文件去定义全局变量的话,那么就在其他模块引用时将#include头文件去掉,在其他模块添加extern char g_Char,本模块不用extern去修,这个时候编译器就知道g_Char时引自外部的编译模块了,不会在本模块再重复定义一个出来了,这样会有个弊端就是其他模块每每使用一个全局变量或函数都要用extern做修饰,头文件的作用就是给外部提供接口使用,所以只在头文件做声明就可以了。

    4.用static修饰全局变量:extern 和 static不能同时修饰一个变量,其次static 修饰全局变量时,同时也被定义了,static修饰全局变量的作用域智能是本身编译单元,也就是说它的全局只对本编译单元有效。所以一般定义static全局变量时,都把它放在源文件中而不是头文件,这样就不会给其他模块造成不必要的信息污染。

    5.const :const修饰的全局常量具有跟static相同的特性,即只能作用于本编译模块中,但const 可以与extern连用来声明该常量可用于作用于其他编译模块中。

    本文引自https://www.cnblogs.com/wujing-hubei/p/5944672.html

     

    总结:全局变量声明在.h文件,定义在本模块.c文件,其他模块则引入.h文件就可以直接引用。

    展开全文
  • 全局变量的生命周期一直到程序的结束,全局变量是静态存储方式。 例: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; /* a 就是一个全局变量*/ int a = 2; int main(int argc, ch...
  • 如果全局变量在定义时不初始化则初始值是0,如果局部变量在定义时不初始化则初始值是不确定的。所以,局部变量在使用之前一定要先赋值,如果基于一个不确定的值做后续计算肯定会引入Bug。
  • C全局变量使用简介

    2017-09-11 14:11:34
    在平时练习中遇到这样一种情况:希望我在头文件中定义的全局变量可以被多个.c文件公用。 开始我直接子头文件中写一个定义如inta; 但是问题很快就来了,编译的时候,编译器报错,多次定义a。在这里应该考虑的是,...
  • c全局变量、static

    2010-06-30 10:26:00
    全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域...
  • object-c全局变量

    2015-10-21 15:55:00
    跟c++一定,在.m里Obj*obj=NULL,在.h里extern Obj*obj 即可。
  •  if(局部变量i > 全局变量K){ 。。。。。。} B函数中有如下代码:定义局部变量i;if(局部变量i > 全局变量K){ 。。。。。。} 运行时发现,A函数可以正确执行,而B函数不可以。没有办法,只得将B函数改为两个...
  • python ctypes 无法调用C静态全局变量 但是可以调用全局变量这是我试验了很久得出的结论 经过试验发现python中调用的全局变量地址和在调用动态库中c函数时所打印出的全局变量的地址是同一个,说明可以通过操作地址...
  • 全局变量不能和局部变量重名C. 全局变量在程序执行的全过程有效D. 一个程序中的变量更多相关问题【填空题】饮用水净化的目的是 ,净化的方法包括 和 。【单选题】理论力学和材料力学的研究对象分别主要是( )【判断...
  • 2、静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。...
  • C定义全局变量

    万次阅读 2018-01-08 19:22:49
    这时候全局变量就起到一个桥梁作用,在函数外定义,在主函数中调用定义,在子函数A中调用并赋值,在子函数B中调用该变量,此时的值已经是改变之后的值。  用法:在主函数之前定义全局变量(不包含在任何变量里)...
  • 全局变量与全局静态变量的区别:  (a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。  (b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的...
  • C 语言全局变量

    2018-03-14 20:34:06
    全局变量:1、定义在函数的外面,使得所有的函数都能访问到2、定义方式1:类型 名称定义方式2:类型 名称=初值3、全局变量既不存储在代码段上,也不存储在栈上,而是操作系统专门给它开辟的数据段(DATA段)上。...
  • C/C++中的变量分为全局变量、静态全局变量、局部变量和静态局部变量,在《C/C++中静态局部变量的特点与应用》中我们介绍过静态局部变量,今天我们的目标是全局变量。 单个文件中的全局变量  简单一点说,全局...
  • C语言里全局变量管理

    千次阅读 2014-10-15 11:39:28
    C 全局变量
  • 静态变量:存储在全局数据区(静态数据区) 2、生命期 动态变量:根据你定义的位置确定,比如你在一个函数中定义的,那么超出该函数范围变量将失效 静态变量:程序结束时才释放 3、作用域 动态变量:...
  • 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是...
  • C/C++ 全局变量(外部变量) 整个工程文件内 内存的静态存储区域 整个源程序 0 没有全局变量的概念 在main()函数前(类外)定义,用extern int g_int ;声明,才可以使用 静态全局变量 定义它的文件内 内存的...
  • C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域...当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。 (2)静态局部变量具有局
  • 全局变量 在函数外部定义的变量是全局变量。 没有初始化的全局变量默认是0,指针是NULL。 (本地变量没有默认的初始值) 全局变量的初始化发生在main函数之前。 只能用编译时刻已知的值俩初始化全局变量。 ...
  • 全局变量局部变量静态全局变量、静态局部变量的区别   转自:http://hi.baidu.com/sindana/blog/item/06fe68171e364401c93d6ded.html 标签:全局变量 局部变量 静态全局变量 静态局部变量 ...
  • 1.全局变量与局部变量全局变量:指在函数之外定义的变量,一般没有缩进,在程序执行的全过程有效局部变量:指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在例1:n = 1 # 全局变量def func(a, b...
  • 在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 、.cpp、.h 文件。当一个cpp文件需要使用另一个cpp文件定义的全局变量,通过用extern声明,就...
  • 当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。 <br />静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全
  • 全局变量与全局静态变量的区别: (a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。 (b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,787
精华内容 7,514
关键字:

c全局变量