extern

转载自:https://blog.csdn.net/u012333003/article/details/25824243

变量声明和变量是有区别的。C++支持分离式编译机制,即程序可以被分割成多个文件,编译时每个文件都是单独被编译。这样,如果程序有多个文件,则需要在文件中有共享代码的方法。比如一个文件中要使用另一个文件中定义的变量,我们将如何调用?

  解决问题的办法是实现变量的声明与定义相分离,声明变量使得名字为本程序文件所知道,比如一个文件如想使用在另外一个文件中定义的变量,则必须包含对那个变量名字的声明,以让该文件知道这不是要创建一个新的变量实体,只是说明来自于它处。而定义变量则是创建一个与名字相关的实体。声明与定义变量的相同点就是都规定了变量的类型和名字,不同的是,定义变量还会给变量申请存储空间,还可能给变量赋予一个初始值。

  如果我们只是要声明一个变量,无需定义,则在变量前加关键字extern即可,而且还不能显式初始化变量,加extern关键字表明该变量已经在别的程序文件中定义,这里只是说明在本程序文件中通过这种方式告之本程序要用到那个名字变量为在别处定义的变量。

  1. extern int i;  //只是声明i而非定义i  
  2. int j; //声明而且还定义了j  
需要注意的是,任何一个显式初始化的声明都将成为定义,而不管有没有extern,extern语句一旦变量赋予了初始值就变成了定义。

  1. extern double pi=3.1415926;  //定义  
在函数内部,如果试图初始化一个extern关键字标记的变量将是错误的,我们需要记住的是,如果想要在多个文件中使用同一个变量,得必须将变量的声明和定义相分离,变量的定义出现且只能出现在其中一个文件当中,而其他用到该变量的文件则必须对其进行extern式的声明,不可再重复定义。

------------------------------------------------------------------------

三、extern关键字——extern的用法之二指明变量的外部链接属性

  上面已经讨论了变量的声明与定义的问题,已经把extern关键字带出水面,extern关键字看起来更像static的反义词,它将后面的变量名指明是外部链接的,比如const和typedef在默认情况下都是内部链接。还有是声明一个变量是来自外部文件的,编译器将该条语句当做声明而不是定义。我们知道,声明只是声明,无需为之分配空间。但是在某一处该变量必然是有它的定义的,正如上面所说,变量的声明和定义只是分离了,但肯定是都有的。如果你没加extern,编译器会认为你是在定义一个变量,而且相应为它分配空间,这样可能是引发冲突,因为在别的程序文件中你可能已经定义了该变量,然而你在此又定义了该变量的话,即意味着有两个全局作用域的变量,对于这种情况,我们必须得使用extern来说明是在跨文件访问这个全局变量。

------------------------------------------------------------------------

四、总结

  总的一点来说,extern有两个作用,一是由于const和typedef在默认情况下是内部链接(静态链接)的,我们用extern去修饰可让它变成外部链接,让其他程序文件可见。

二是用extern修饰后的变量名可表示是一个变量声明,且仅仅是声明,它的定义和声明不在一起,可能是在别的文件中已经定义了该变量,我们在本文件中使用extern声明仅仅是告诉编译器,我们有这么个名字的变量要用到,它的定义来自于别的文件中。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章