extern的疑问
希望大家只讨论用法,不考虑代码有无必要,谢谢!
#include <iostream>
#include <string>
using namespace std;
int main()
{
string extA;
extern string extA;
return 0;
}
string extA = "extA_global";
编译出错,extA重定义,可以理解。
#include <iostream>
#include <string>
using namespace std;
int main()
{
extern string extA;
cout << extA;
return 0;
}
extern string extA;
string extA = "extA_global"; // 为何没有重定义错误?
编译通过,运行正常,有如下疑问:
1、extA为何没有重定义错误?
2、extern 是不是只能声明全局变量,如果在某个函数中定义某个变量,其他地方还可以利用extern声明使用吗?
3、在定义用于extern外部使用的全局变量时,以下两句话有区别吗?extern可有可无?
c++ extern
extern string extA = "extA_global";
string extA = "extA_global";
[解决办法]
extern仅表示该变量或函数在其他编译单元的全局域或本编译单元当前位置之后的全局域中定义(在本编译单元当前位置之前的全局域定义当然也可以,但这样可省略extern声明)。
[解决办法]
因为extern只是声明, 不会定义.
你的代码1中, 因为定义了一个局部的extA, 然后又
在局部显示的声明extern extA,这时编辑器就不知道该用哪个extA了.
如果你不显示声明, 那么局部优先原则, 会使用局部的那个extA.
对于代码2中. 因为extern只是声明,不定义, 所以不会重定义.
即便你在main中定义的局部的extA,也不会重定义, 因为有局部优先原则.
[解决办法]
你可以简单理解为,extern把一个全局变量引入到了指定的作用域中。如果这个作用域是局部的,就约等于是在这个局部中定义了一个变量,这样你再定义一个就重复了。因为名称相同,但地址却不同,无法仅靠名称就去匹配相应的变量。
如果是全局的就没问题,因为extern本身就是对一个全局变量的声明,只不过是把你的定义再次引入了全局变量中,这两个变量名虽然相同,但变量的地址是同一个,所以没事。
[解决办法]
你在main函数中这样写代码.
extern string extA;
string extA = “extA_local”;
它就会认为extern string extA;是对全局的那个变量进行的声明, 而不是局部的那个, 所以就有了两个extA, 所以就会重定义.
而你在全局中, 它只会认为是那个全局的, 所以不会重定义..
当然, 如果你在另外的cpp另也有一个extA的定义, 那么也可以重定义, 具体你自己可以试试.