天天看点

extern && #include *.h

         extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或者函数时在其他模块中寻找其定义。

      如今的编译器一般都是采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部。但是到了链接阶段,各个文件的内容(实际上是编译产生的obj文件)是被合并到一起的,定义于某文件内的全局变量,在链接完成后,它的可见范围被扩大到了整个程序。因此,如果某些文件中定义的全局变量名相同的话,在这个时候就会出现错误,因此,各个文件中定义的全局变量名不能相同。

       编译器在编译过程中不会意识到某个变量符号虽然不是本文件定义的,但是它可能是在其它的文件中定义的。为了帮助编译器来解决这个问题。就要使用extern了。extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你只要放行就ok了!”

       函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。如下述两个函数声明没有明显的区别:

   extern int fx(); 和int fx();  

    当然,这样的用处还是有的:在一些复杂的项目中,在函数声明前添加extern修饰,就可以在程序中取代include “*.h”来声明函数。但是当函数提供方单方面修改函数原型时,如果在使用方不知情的情况下继续沿用原来的extern声明,这样编译时编译器不会报错。但是在运行过程中,因为少了或者多了输入参数,往往会造成系统错误。目前业界针对这种情况的处理没有一个很完美的方案,通常的做法是提供方在自己的头文件中提供对外部接口的声明,然后调用方include该头文件,从而省去extern这一步以避免这种错误。由此可见对extern的应用,不同的场合应该选择不同的做法。

         变量的声明中带有关键字extern,并没有生成新数据,它仅表明这个数据是共享的。这个变量必须是在别处定义过的,而且它只能定义一次  

extern   int   a;

        是对变量的声明,而不是定义,表示该变量a是其他文件中定义的,或是本文件中在该声明之后定义的全局变量,需要在这里引用。由于 a已在别的地方定义了,所以不需要再分配空间了。

         变量在使用前已经定义了,一般有两种情况:

一:该变量是在其他的文件中定义的全局变量,简称外部变量。

二:变量在本文件中定义的全局变量,但是在使用之后定义的。  

      extern   int   a;//这是变量的声明,是告诉编译器到该文件外部去找这个文件的定义;声明是不分配内存的 

      int   a;              //这是变量的定义,变量定义是分配空间的 ;

      定义只能有一处,但声明可有多处,这些声明所指,都是定义时分配的内存空间   

继续阅读