作用域与可见性、extern

本文探讨了C++中的作用域概念,包括局部作用域和全局作用域,并通过示例详细解释了可见性的含义。此外,还介绍了如何利用extern关键字在不同源文件间共享全局变量和函数。

作用域:C++中按照作用区域的大小,可以把作用域分为局部作用域和全局作用域

可见性:可见性是从另外一个角度(标识符引用)来看作用域的。换句话说,标识符只在作用域内可见

1. 局部作用域
#include <iostream> 
using namespace std;
//作用域与可见性 
int getNum(void)
{
	int num = 0;
	{
		cout<<num<<endl;	//上下级关系,这个num还是原来的父作用域中num=0 
		int num; //新定义了一个num,两个num不一样,这个num只在此作用域里有效 
		num = 1;
		cout<<num<<endl;
	}
	return num;
}

int main()
{
	cout<<getNum()<<endl;
	return 0;
}
/*output:
0
1
0 */

与下面的代码进行比较:

#include <iostream> 
using namespace std;
//作用域与可见性 
int getNum(void)
{
	int num = 0;
	{
		cout<<num<<endl; //一直也在没定义别的num,所以都是一个num
		++num;
		cout<<num<<endl;
	}
	return num;  //这里不是0了,是改后的num = 1!
}

int main()
{
	cout<<getNum()<<endl;
	return 0;
}
/*output:
0
1
1 */

2. 全局作用域

#include <iostream>
using namespace std;

int gn;	//全局变量 
void get(int a, int b)	//全局函数 
{
	for(gn = 0; gn<5; ++gn)
	{
		cout<<"la"<<endl;
	}
}

int main()
{
	gn = 1;
	get(1, 2);
	return 0;
} 
3. extern

问题:在一个项目中,一个当前cpp源文件想要使用另外的cpp源文件中已经定义好一些全局变量或者全局函数(而不是把另外的cpp文件当成头文件添加到当前文件)怎么办?

办法:在当前cpp文件中重新声明要使用另外cpp中已经定义好的全局变量或者全局函数(在变量或者函数名前加extern)即可。这时变量或函数就可以冲出当前源文件,走向整个项目,实现共享,避免重复声明的效果
C++程序往往被分解为多个源文件和头文件,但是全局作用域内的变量或者函数只在单个源文件范围内可见。如果想在多个源文件中使用某个源文件定义的全局变量应该怎么办?很简单,extern关键字可以找到定义在其他源文件中的全局变量。当想使用某个已经在其他源文件中声明的全局变量或全局函数时,可以在这个源文件中对变量或者函数加上 extern 关键字进行修饰,对变量或者函数重新进行声明,表示这是一个扩展的声明。编译器会在其他源文件中查找这个变量或者函数的具体定义,从而使用同一个变量或者函数

/* global.cpp */
int total = 0;  //全局变量
int add(int a, int b)  //全局函数
{
	return a + b;
}
==========================================================================================================================================================

/* helloworld.cpp */
/*没加global.cpp之类的头文件,加了extern对变量或函数重新声明一下,变量或函数就可以冲出当前源文件,走向整个项目 */
extern int total;
extern int add(int a, int b);
#include <iostream>
using namespace std;
int main()
{
	total = add(2, 3);
	cout<<total<<endl;
	
	return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值