浅谈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

C++中,使用extern声明可以在一个文件中调用其他文件中定义的函数,或者说将该函数的作用域扩展到本文件。extern声明的形式是在函数原型基础上加上关键字extern。在程序中经常需要调用其他文件中的外部函数,为了方便编程,C++允许在声明函数时省略extern关键字。例如,在主文件中可以使用extern声明来调用其他文件中定义的函数。\[1\] 举个例子,假设有一个test.cpp文件中定义了一个函数,我们可以在主文件中使用extern声明来调用这个函数。首先,在test.h文件中声明外部函数,然后在test.cpp文件中定义外部函数并进行初始化。最后,在主文件中使用extern关键字来调用外部函数。\[2\] 另外,C++中还有内部函数,也称为静态函数。使用内部函数可以使函数只局限于所在文件,如果在不同的文件中有同名的内部函数,它们互不干扰。通常将只能由同一文件使用的函数和外部变量放在一个文件中,并在它们前面加上static关键字使之局部化,其他文件不能引用这些函数和变量。\[3\] #### 引用[.reference_title] - *1* *3* [简单讲解C++的内部和外部函数以及宏的定义](https://blog.youkuaiyun.com/weixin_39663258/article/details/117269869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++声明extern变量extern函数的用法](https://blog.youkuaiyun.com/wenchm/article/details/130765956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值