浅谈C++ extern声明

初出茅庐,正在学习C++的路上,只是这条路还一直在施工,呵呵。这几天回头复习下基础知识,对extern在《C++ primer》书中的定义理解不是很透彻,又和朋友探讨了一下,于是我们打算实践一下来帮助理解。下面我就来说说实践中的感受吧~

引用《C++ primer》书中对extern的说明:

extern声明不是定义,也不分配空间。事实上,它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。

任何在多个文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)。

看到这里,我不禁有几个疑惑:

  1. extern声明时能不能定义变量?
  2. extern是跨文件的吗?不需要引用头文件?
  3. 如果多个头文件中都定义了同名变量会出现什么情况?
  4. 声明的同时定义一个相同的局部变量,会发生重名吗?

下面我进行了一翻实践,首先创建a.h头文件,代码如下:

int a = 1;

接着,创建main.cpp文件,代码如下:

#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。代码如下:

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变量,其他代码不变。代码如下:

#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上它只是说明变量定义在程序的其他地方的意思,这些教材上很多翻译过来的话都非常专业,让初学者很难理解真正的目的,最后呢,请各种大神,高手手下留情。如有错误或者意见,欢迎私信或者评论。

转载于:https://www.cnblogs.com/laijingwu/p/3233045.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值