精华内容
下载资源
问答
  • 外部变量和声明

    2009-09-07 17:54:00
    外部变量的生命周期:由程序执行(不是函数)开始,至程序结束 外部变量能否跨... 能,但必须声明主文件定义一个外部变量main.cMYSQL sqlstream; 又添加了一个.c文件, 引用在主文件定义外部变量generatedatafile.c

     

       外部变量的生命周期:由程序执行(不是函数)开始,至程序结束

        外部变量能否跨文件引用(即多个文件操作同一变量)? 能,但必须声明
    主文件定义一个外部变量
    main.c

    MYSQL sqlstream; 
    又添加了一个.c文件, 引用在主文件定义的外部变量
    generatedatafile.c
     报错 
    [macg@localhost mysqltmp]$ make
    gcc -c generatedatafile.c
    generatedatafile.c: In function datafile
    generatedatafile.c:16: error: mqlstream undeclared (first use in this function) 
    解决:跨文件外部变量必须声明
    vi generatedatafile.c
    extern MYSQL sqlstream;  
    [macg@localhost mysqltmp]$ make
    gcc -c liu.c
    gcc -c generatedatafile.c
    gcc -g main.o liu.o generatedatafile.o -o liu -L /usr/lib/mysql -lmysqlclient -lz   



       两种外部变量声明
    • 函数内声明
    用于函数内引用"定义在函数下面的外部变量"
    main()
    {
    extern int a;        
    }
    • 函数外声明
    用于跨文件引用别的文件定义的外部变量
    extern MYSQL sqlstream 

      
       同一文件中,外部变量引用和定义确实有作用域问题,必须定义在前面,应用在后面, 因为程序上从上到下顺序执行的
    下面就是一段出错的外部变量定义:
    $ vi test.c
    #include <stdio.h>
    main()
    {
    ttt=7;
    menu();

    printf("from main ttt is %d",ttt);
    }
    menu()
    {
    printf("ttt is %d/n",ttt);

    }

    int ttt;    
    $gcc -o test test.c -lcomm
    test.c: In function main()
    test.c:6: error: ttt undeclared (first use in this function)
    test.c:6: error: (Each undeclared identifier is reported only once
    test.c:6: error: for each function it appears in.)
    test.c: In function menu()
    test.c:16: error: ttt undeclared (first use in this function)   
    但能否变量定义在后面呢? 也可以,但前面的变量引用必须增加变量声明(实际更烦琐,不如把函数定义在前面)
    $ vi test.c
    #include <stdio.h>
    main()
    {
    extern int ttt;
    ttt=7;

    menu();

    printf("from main ttt is %d",ttt);
    }

    menu()
    {
    extern int ttt;
    printf("ttt is %d/n",ttt);

    }

    int ttt;
    $ gcc -o test test.c -lcomm
    $ ./test
    ttt is 7
    --------1
    --------2
    --------3
    --------4
    input slot: ------->3
    from main ttt is 7   

      

        与外部变量不同,函数的引用和定义,在同一文件中没有前后问题,函数作用域是整个文件
    #include <stdio.h>
    main()
    {
    int rowCount,colCount,i,j,ret,test;
    char a[5],b[5],s[80];

    menu();
    printf("input slot: ------->");
    scanf("%s",a);
    while (!checknumber(a)) scanf("%s",a);
    }

    menu()
    {
    printf("--------1/n");
    printf("--------2/n");
    printf("--------3/n");
    printf("--------4/n");
    }
    $ gcc -o test test.c –lcomm    
    $ ./test
    --------1
    --------2
    --------3
    --------4
    input slot: ------->3    
    展开全文
  • 外部变量和静态变量

    千次阅读 2013-12-05 20:08:31
     外部变量是在函数外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的结尾。在此作用域内,全局变量可为各个函数所引用。编译时将外部变量分配在静态存储区。有时需要在其他文件中使用extern来...

    外部变量

    1.简介

                外部变量是在函数外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的结尾。在此作用域内,全局变量可为各个函数所引用。编译时将外部变量分配在静态存储区。有时需要在其他文件中使用extern来声明外部变量,以扩展外部变量的作用域。 也可用static声明外部变量,使该变量不能被其他文件引用。

    2.用extern声明外部变量

    extern可省略不写。
    本文件里:在一个文件里,有不止一个函数,外部变量在第一个函数前面定义。若用extern在第一个函数前声明该变量则该变量可以在第一个函数中使用。
    多个文件中:在其他文件中若想要使用该文件中已声明的全局变量,则在其他文件头部声明该变量,即可使用该全局变量。

    3.用static声明外部变量

    static声明后该外部变量就只能在本文件中使用。

    静态变量

    静态变量的类型关键字是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量, 例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 对于自动变量,它属于动态存储方式。 但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。 由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。(区分静态全局变量与静态局部变量)

    1.概念定义

    “静态变量”这一术语有两个容易混淆的定义:

    静态全局变量和静态局部变量有不同的生存周期,静态局部变量的生存期与整个源程序相同,静态全局变量的生存期值存在于一个源文件内。

    2.常量使用

    静态变量也可以用于存储常数。具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时(英语:Compile time)设定,并且无法在运行时改变。编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;而如若有需要,有些编译器还可选择为其开辟专用区;为防止常数变量被错误的指针写入覆盖,亦可在这块区域启用内存保护机制。

    3.变量特点

    静态局部变量

    静态局部变量属于静态存储方式,它具有以下特点:
    (1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
    (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
    (3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型变量赋空字符。
    (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。
    举例说明:

    区别静态局部变量和动态局部变量

    #include<stdio.h>
    int fun(int n)
    {
        static int f= 1;
        f=f*n;
        return f;
    }
    void main()
    {
        int i;
        for(i =1;i <=5;i++)
            printf("fun(%d) = %d\n" , i , fun(i));
    }
    
    运行结果:

    fun(1) = 1
    fun(2) = 2
    fun(3) = 6
    fun(4) = 24
    fun(5) = 120
    

    静态全局变量

    全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。应予以注意。

    不同作用

    除明确标识出变量的生命周期英语:Object lifetime)外,将变量声明为static存储类还会根据变量属性不同而有一些特殊的作用:
    对于静态全局变量来说,针对某一源文件的以static声明的文件级变量与函数的作用域只限于文件内(只在文件内可见),也即“内部连接”,因而可以用来限定变量的作用域
    对于静态局部变量来说,在函数内以static声明的变量虽然与自动局部变量的作用域相同(即作用域都只限于函数内),但存储空间是以静态分配而非默认的自动分配方式获取的,因而存储空间所在区域不同(一般来说,静态分配时存储空间于编译时在程序数据段分配,一次分配全程有效;而自动分配时存储空间则是于调用栈上分配,只在调用时分配与释放),且两次调用间变量值始终保持一致;
    对于静态成员变量英语:Member variable)来说,在C++中,在类的定义中以static声明的成员变量属于类变量英语Class variable),也即在所有类实例中共享,与之相对的就是过程变量英语Instance variable)。

    展开全文
  • C++:外部变量和静态变量

    千次阅读 2018-03-21 19:38:06
    外部变量定义和声明是不同的。外部变量的定义只能有一次,它的位置在所有函数之外,而统一文件中的外部变量声明可以有多次,它的位置可以在函数之内,也可以在函数之外。 系统根据外部变量的定义,而不是声明,...
    外部变量的定义和声明是不同的。外部变量的定义只能有一次,它的位置在所有函数之外,而统一文件中的外部变量的声明可以有多次,它的位置可以在函数之内,也可以在函数之外。 系统根据外部变量的定义,而不是声明,分配存储单元。对外部变量的初始化,只能在定义时进行,而不能在声明中进行。
    关于全局变量(作用域在全局,可跨.cpp)
    在x.h中定义一个结构体类型mem_data,将其包含在1.cpp中,则可在1.cpp中定义结构体变量mem_pool[4][5]
    若想在其他cpp(2.cpp)中使用该结构体变量,则需要包含x.h文件,且需要在x.h中对该变量进行外部声明extern mem_data mem_pool[4][5];(说明该变量可以为全局所用)
    eg:
    x.h
    extern int a;//声明其为全局变量
    1.cpp
    #include "x.h"
    int a = 0;//定义变量a,需定义在函数外,否则程序会将其认定为局部变量,同时会将2.cpp中的a认定为未定义的变量,出现链接错误(LINK1120)
    void fun()
    {
    a = a + 2;
    }
    2.cpp
    #include "x.h"
    a = a + 2;//无需定义,a=4
    
    
    
    关于静态变量(作用域在一个.cpp中,使用时可以全局拷贝,但每个cpp开始使用时变量都从定义时的初始化值开始执行)
    在x.h中定义
    eg:
    x.h
    static int a = 0;//定义赋初值并声明为静态变量
    1.cpp
    #include "x.h"
    a = a + 2;//a = 2
    2.cpp
    #include "x.h"
    a = a + 2;//a = 2
    


    展开全文
  • 1) 函数,外部变量定义和声明问题  1)(2017-9-17日目前认为) 局部变量无论定义时赋值与否 (int a 或 int a = 2),我们都可以大概认为此时 定义和 声明是一回事,但通过反汇编我们可以知道如果没有赋初值...

    1) 函数,外部变量的定义和声明问题

        1)(2017-9-17日目前认为) 局部变量无论定义时赋值与否 (int a 或  int a = 2),我们都可以大概认为此时 定义和 声明是一回事,但通过反汇编我们可以知道如果没有赋初值那么其实只是一种奇怪的声明,并没有定义,因为定义的概念是在存储空间中有实体。

        2) 没有static 的全局变量 称之为外部变量 (外部变量,固名思意,个人认为外部变量相当于开了上帝视角的变量,不受单个源文件篇幅限制,其作用范围可以利用extern声明扩展到任何源代码文件的任何部位)。ps: 正因为外部变量是在所有源文件之外定义的,他们的作用范围可以扩展到源文件的任意地方。所以一个外部变量只能在一个cpp中定义,但可以多个cpp中声明。

        3)函数的定义和声明:

              在C++语言中函数不能在 函数内部定义,而且函数的“定义”也需要占据存储空间(在代码区存储),所以函数(的定义)也就相当于外部变量。在函数声明时 可以显示的声明 (+extern) 而我们大多数情况下是 隐示的声明的。

        4)关于声明的理解:

              声明的作用在之前已经提到,是为了编译的顺利通过(定义是否缺失,是否重复,在链接部分执行),只要声明了 相关的函数,外部变量,程序就不会显示语法错误。声明是为了告诉编译器以下内容我在某一个地方定义了,让编译器从上到下编译时认得某些函数或者变量(外部变量)的名字(认得就行,不管是否定义),从而顺利编译。详见一下代码:ps 虽然不可以重复定义但是可以重复声明。

              comA.h 文件

    namespace A{                                      //关于头文件的作用,头文件一般情况不包含函数,外部变量的定义(可能导致重复定义),只包含声明。                                                      //在编译的时候,我们只编译cpp文件,头文件的作用只是 #include到cpp文件中区。并不编译生成.obj文件
    
    	extern void fun();                        //声明一个在 A 命名空间的 fun()函数,告诉编译器 反正我在 某个地方定义了。
    		/*{                               //在不使用 命名空间时 如单纯的 void fun();,表明 声明了一个 全局命名空间的 fun()
    		std::cout << "A"<< std::endl;
    		}*/
    	extern int x;                            //声明一个 在A命名空间中的 全局变量 x ,其定义在 其他.cpp文件中实现。让编译器 认得 A::x
    
    }


               comA.cpp 文件

    #include <iostream>
    #include "comA.h"
    
    void A::fun(){
    	std::cout << "this is A::fun()";
    }
    
    //namespace A{
    //	int x = 33333;
    //}                        //注释和下一行等价,都是定义了一个 在A 中的 x = 3333
    
    int A::x = 33333;
    int x = 55555;
    

        main.cpp 文件
    #include <stdlib.h>
    #include <iostream>
    #include "comA.h"
    
    
    
    
    //可以重复的声明,但是不可以重复的定义  我可以连着 声明 两次 fun();
    
    //extern int A::x;
    int main(void)
    {
    	//std::cout<< x <<std::endl;
    	std::cout<< A::x <<std::endl;
    
    	A::fun();
    	
    	std::cout << "hello"<<std::endl;
    	system("pause");
    	return 0;
    }
    

    参考链接 我的论坛问答:问答

    ps :所有源文件都需要编译,所以哪怕没有用的源文件都必须正确,因为一个工程中的,h文件在#include到.cpp之后才能起作用(被编译),所以头文件若没有被任何#include就可以有语法错误。

    pps: 外部变量在.cpp编译时在静态存储区分配内存,所以如果在不同.cpp中定义了相同的外部变量,就会重复定义。



       


    展开全文
  • //头文件.h //定义常数 #ifndef _constants ...[b]我的目的是,ab这两个变量在头文件中就设定好数值,然后在其他所有include这个头文件的源文件中,ab都可见,并且可以直接使用而免去声明[/b]。 怎样实现?
  • 变量声明和定义区别

    2019-09-03 18:52:39
    变量声明和定义区别? 声明仅仅是把变量的声明的位置及类型提供给编译器,并不分配内存空间;定义要在定义的地方为其分配存储空间。 相同变量可以再多处声明(外部变量extern),但只能在一处定义。 "零值比较"? ...
  • 静态变量和外部变量

    2013-03-19 21:37:35
    staticextern是两种可以全局作用的变量。 在这里,先说明“声明定义”的区别。...然而外部变量声明和定义是分开的,并且可以在多个文件中多次声明同一个变量(要注意,外部变量定义一定要在函数体外
  • extern 声明外部变量

    千次阅读 2014-10-16 11:26:15
    声明外部变量 现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是 互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部。 创建一个工程,里面含有A.cppB.cpp两个...
  • 1、外部变量 C++允许变量的跨文件调用,此时将跨文件调用的变量称为外部变量,调用外部变量需要使用extern关键字进行声明。下面的例子在xx.h文件中定义一个全局变量,然后在main.cpp文件中使用extern声明xx.h文件中...
  • //关于变量声明和定义 一个函数一般由两部分组成:声明部分执行语句 在声明部分出现的变量有两种情况:一种是需要建立存储空间的(如"int a;"), 另一种是不需要建立存储空间的(如"extern a;"). 前者称为定义性...
  • 内部函数和外部函数 【3】变量声明定义  对于函数。声明部分是对有关标识符(变量、函数、结构体)的属性进行声明;函数的声明是函数的原型,而函数的定义是对函数功能的定义。对被调函数的声明...
  • C语言的局部变量和外部变量

    千次阅读 2015-08-14 06:03:04
    在函数体或复合语句中声明的变量为局部变量。函数中的形式变量也是局部变量。在所有函数体外定义的变量称为外部变量(或全局变量)。
  • 变量声明和定义

    2016-04-15 20:42:29
    二.变量的声明和定义 声明一个变量意味着向编译器描述变量的类型,但并不为变量分配存储空间。 定义一个变量意味着在...(2) 外部变量用static来声明,则该变量的作用只限于本文件   a.隐形刺客:auto 作用:C
  • 声明外部变量 extern

    2014-05-11 10:13:14
    现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相不透明的。也就是说,在编译时,全局变量的可见域限制在文件内部。 下面举一个简单的例子: 创建一个工程,里面含有A.cppB....
  • 在程序设计中,时时刻刻都用到变量定义和变量声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:变量声明有两种情况:(1) 一种是需要建立...
  • 1、外部变量 C++允许变量的跨文件调用,此时将跨文件调用的变量称为外部变量,调用外部变量需要使用extern关键字进行声明。下面的例子在xx.h文件中定义一个全局变量,然后在main.cpp文件中使用extern声明xx.h文件中...
  • 【1】变量声明定义 对于函数。声明部分是对有关标识符(变量、函数、结构体)的属性进行声明;...【2】内部函数和外部函数 有的函数只能被本文件中的其他函数调用,不能被其他文件中的函数调用;有的只能被
  • C++调用外部函数和外部变量

    千次阅读 2018-04-03 22:37:26
    一个C++工程中,如果main.cpp需要调用在functions.cpp中定义的函数,须在头文件common.h中加入函数的声明,在main.cppfunctions.cpp中都需要加入#include&lt;common.h&gt;如果需要多个文件共享的全局变量...
  • 先看一下程序的运行结果;Win32程序,没窗口;只有WinMain入口; ...main.c使用了a.c、b.c、d.c中的函数;... /* 定义外部变量 */ int power(int); /* 函数声明 */ int APIENTRY WinMain(HINSTANCE hInstance,
  • 比如要在b.c想要调用a.c里的变量aa或函数aaa,则需要将a.c里的变量aa函数aaa设置为外部变量和函数 方法: 在a.h中声明aa变量aaa函数: extern int aa; extern void aaa(void); 然后在a.c中定义aa变量aaa...
  • 可以使用 extern显性声明一个外部全局变量 特点: 可以定义同名的多个外部全局变量;多个同名的外部全局变量指向同一块存储空间 eg: extern int num; 2,内部全局变量 概念:只能被当前文件访问的全局变量...
  • 变量声明 使用“extern + 数据类型 + 变量名”的形式,是告诉编译器这个变量将在其它外部C文件中定义,这里只是在外部用它,故不用分配内存单元。 如:int a; (变量定义) extern int a; (变量声明)
  • 变量的声明和定义有什么区别1.为变量分配地址存储空间的称为定义,不分配地址的称为声明。2.一个变量可以在多个...注意:很多时候一个变量,只是声明不分配内存空间直到具体使用时才初始化,分配内存空间,如外部变量
  • 局部变量和成员变量定义和区别

    千次阅读 多人点赞 2018-06-23 15:38:07
    局部变量和成员变量的区别和定义 局部变量 成员变量 定义位置: 方法或方法的内部 类的内部,方法的外部 默认值: 无默认值 字面值,(与数组相同)的... 注:如果成员变量声明和赋值...
  • C变量声明和定义

    2015-05-25 14:31:56
    C变量声明定义时,需要类型说明符、存储类型、类型限定符。类型说明符就是,能够说明某个变量是什么类型的就是类型说明符,比如:int、double、char、指针、结构体、枚举等等,只要它能够说明变量是什么类型的就是...
  •  网上找了下说(标题)是正确...如上面函数, 原本我以为没有定义全局变量 x ,函数内直接声明 x=222 会报错, 但是并没有报错, print(x) 也输出了值,  我一直理解的是应该先定义一个全局变量 如下: <p>... ...
  • 变量定义和声明的区别: 变量的声明有两种情况: 定义性声明(定义):需要建立存储空间,eg:int a;在声明时就已经建立好存储空间了。 引用性声明:不需要建立存储空间,eg:extern int a;仅是变量a的声明,...
  • C变量声明定义时,需要类型说明符、存储类型、类型限定符。类型说明符就是,能够说明某个变量是什么类型的就是类型说明符,比如:int、double、char、指针、结构体、枚举等等,只要它能够说明变量是什么类型的就是...
  • 一个全局变量或函数可以 (在多个编译单元中) 有多处 “声明”, 但是 ... 最好的安排是在某个相关的 .c 文件中定义, 然后在其对应的头文件 (.h)(用extern修饰) 中进行外部声明, 在需要使用的时候, 只要包含对...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,936
精华内容 774
关键字:

外部变量定义和外部变量声明