蛋疼的extern

来源:互联网 发布:网络诈骗如何判刑 编辑:程序博客网 时间:2024/06/02 23:26
    extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。

    程序的生成:先编译后链接。

    现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相不透明的。也就是说,在编译时,全局变量的可见域限制在文件内部。链接时它的可见范围被扩大到了整个程序。

    下面举一个简单的例子:

    创建一个工程,里面含有A.cpp和B.cpp两个简单的C++源文件:

    //A.cpp

    int i;

    int main()

    {

    }

    //B.cpp

    int i;

    这两个文件极为简单,在A.cpp中我们定义了一个全局变量i,在B中我们也定义了一个全局变量i。

    我们对A和B分别编译,都可以正常通过编译,但是进行链接的时候,却出现了错误。原因就是上面标注的红色部分。


       下面再看一个列子:

    extern int a;//声明一个全局变量a

    int a; //定义一个全局变量a

    extern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。

    int a =0;//定义一个全局变量a,并给初值,

    当你要引用一个全局变量的时候,你就要声明extern int a;这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明。

    extern 和 static

    (1) extern 表明该变量在别的地方已经定义过了,在这里要使用那个变量。

    (2) static 表示静态的变量,分配内存的时候, 存储在静态区,不存储在栈上面。

    static 作用范围是内部连接的关系, 和extern有点相反。它和对象本身是分开存储的,extern也是分开存储的,但是extern可以被其他的对象用extern 引用,而static 不可以只允许对象本身用它。(只能本模块里面使用) 具体差别首先,static与extern是一对“水火不容”的家伙,也就是说extern和static不能同时修饰一个变量;其次,static修饰的全局变量声明与定义同时进行,也就是说当你在头文件中使用static声明了全局变量后,它也同时被定义了;最后,static修饰全局变量的作用域只能是本身的编译单元,也就是说它的“全局”只对本编译单元有效,其他编译单元则看不到它。

       一般定义static全局变量时,都把它放在原文件中而不是头文件。 extern要放在头文件中,声明,而不是定义