C++中的extern关键字

总的来说,extern的含义就是“外部的”,有两个用法。

  • 一是当变量还没定义时,用来告诉编译器,这里只声明这个变量,而不去定义它。即告诉编译器,这个变量是“外部的”定义,不是这儿定义的,在这儿只是声明一下。
  • 二是当变量已经定义了,用在变量定义的前面,那么它的意思就是告诉编译器,这个变量不仅仅在这一个.cpp文件中有效,它在“外部的”其他.cpp文件中也有效,从而定义了全局变量

下面就四种情况来说明一下有无extern的区别。

  • 全局作用域中,

    • 变量名后有初始化式(如 int a = 1;):一旦变量名后跟初始化式,那么很明显,这个变量就已经这样被定义了(只声明未定义的变量怎么能拥有一个值呢?)。所以有无extern,在它的第一点用法上就没有区别了。但在它的第二个用法上还是有区别的,若a是extern的,那么a可以在全程序中共享;若a不是extern的,那么a就只能在本身这个.cpp文件中被使用。然而,这里又有一个C++的规定,即全局作用域中的非const变量,默认都是extern的。于是结果就一目了然了。
    • 变量名后无初始化式(如 int a;):这种情况是C++规定的。如果前面没有extern,那么a就是被定义了,并且自动初始化为0;如果前面有extern,那么a就只是声明,而不被定义。
  • 局部作用域中,

    • 变量名后有初始化式(如 int a = 1;):这种情况下,int前面是不允许有extern关键字的。因为这已经是一个定义了。如果加上extern,就表明这个变量可以在程序的其他文件中访问。但是,这是一个局部变量,一旦函数过程结束,它的生命周期就结束了,怎么还可能在别的文件中访问它?所以它就是一个普通的变量定义。
    • 变量后无初始化式(如 int a;):这种情况类似于第2种情况。如果前面没有extern,那么a就是被定义了,并且没有对a进行任何初始化动作(这将报错,局部变量定义时必须初始化);如果前面有extern,那么a就只是被声明,而未进行定义。

C++规定,使用一个变量时,要在代码中那一点的上方对它进行声明,而不必定义。而对于一个变量,在整个程序中它可以被多次声明,但只能被定义一次。所以,理解extern的用法,对于我们掌握C++是很有帮助的。

posted on 2022-03-07 01:48  朴素贝叶斯  阅读(146)  评论(0编辑  收藏  举报

导航