浅谈C++ extern宣言
初出茅庐,正在学习C++的路上,只是这条路还一直在施工,呵呵。这几天回头复习下基础知识,对extern在《C++ primer》书中的定义理解不是很透彻,又和朋友探讨了一下,于是我们打算实践一下来帮助理解。下面我就来说说实践中的感受吧~
引用《C++ primer》书中对extern的说明:
extern声明不是定义,也不分配空间。事实上,它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。
任何在多个文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)。
看到这里,我不禁有几个疑惑:
- extern声明时能不能定义变量?
- extern是跨文件的吗?不需要引用头文件?
- 如果多个头文件中都定义了同名变量会出现什么情况?
- 声明的同时定义一个相同的局部变量,会发生重名吗?
下面我进行了一翻实践,首先创建a.h头文件,代码如下:
1
|
int a = 1;
|
接着,创建main.cpp文件,代码如下:
1
2
3
4
5
6
7
8
9
10
|
#include <iostream> using namespace std;
int main()
{ extern int a;
cout<<a<<endl;
system ( "pause" ); //用于暂停窗口以看清输出结果
return 0;
} |
输出的结果是1,说明extern声明时是可以定义变量的,同时也解答了第二个问题,extern是跨文件的,不需要引用a.h头文件。
接下来,我们创建b.h头文件,同样定义一个相同变量a。代码如下:
1
|
int a = 2;
|
结果编译器提示报错,报错内容为:
1>main.obj : error LNK2001: 无法解析的外部符号 "int a" (?a@@3HA)
1>E:\Program\c++\练习\cpptest\Debug\cpptest.exe : fatal error LNK1120: 1 个无法解析的外部命令
得到一个这么奇葩的报错提示,我个人认为原因应该是编译器不知道引用哪一个变量a,我们必须指引程序去引用一个变量a。
解决方法可以通过引用需要的那个头文件。
最后,我们在int main()函数中定义一个a变量,其他代码不变。代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
#include <iostream> using namespace std;
int main()
{ extern int a;
int a = 2;
cout<<a<<endl;
system ( "pause" ); //用于暂停窗口以看清输出结果
return 0;
} |
结果是编译器提示报错,报错内容为:“int a”: 重定义。
其实extern的作用就是在此处引用了头文件中的定义,使其能够引用其他文件中的全局变量a,相当于把全局变量变成了函数中可用的局部变量。如果将“extern int a;”这行代码删除,那么输出结果则为2。
总结:经过自己的实践,我终于明白了extern引用是怎么一回事,也明白了primer上它只是说明变量定义在程序的其他地方的意思,这些教材上很多翻译过来的话都非常专业,让初学者很难理解真正的目的,最后呢,请各种大神,高手手下留情。如有错误或者意见,欢迎私信或者评论。