C++进阶-作用域与可见性

所谓作用域,就是某个标识符在程序中有效的区域范围。而可见性跟作用域就像是一个硬币的两面,它是从某个标识符“是否可用”的角度来描述作用域的。如果在某个标识符在某个作用域内是有效的、可以引用的,就说这个标识符在这个作用域内可见。换句话说,就是标识符只在其作用域内可见

作用域

按照作用区域的大小,可以把作用域分为局部作用域和全局作用域。

局部作用域

在 C++中,用大括号“{}”括起来的代码范围属于一个局部作用域。作用域可以嵌套作用域,如果局部作用域中包含更小的子作用域,那么子作用域具有较高的优先级,也就是说,在父作用域中可见的标识符在子作用域中同样可见。在局部作用域内,一个变量或者函数从其定义的位置开始,一直作用到该作用域结束为止。常见的局部作用域有函数体,以及 if、 for 等复合语句。

int GetSum()
{
	// 整个函数体是一个局部作用域
	int nTotal = 0;
	for( int i = 0; i < 100; ++i )
	{
		// 函数体中的 for 循环体,是函数体所嵌套的一个子局部作用域
		// 在父作用域函数体中定义的变量,在子作用域中同样可见
		nTotal += i;
	}
	i = 0; // 错误:在子作用域中定义的变量在父作用域不可见
	// 在作用域中定义的变量,在整个作用域都可见
	return nTotal;
}

全局作用域

如果某个变量或者函数不在任何局部作用域内,就说它在全局作用域中,称为全局变量或者全局函数。全局作用域就是整个源文件范围,其中定义的变量或者函数,从它们被定义时开始,直到文件结束都是可见的。

// 定义一个全局变量
int gN;
// 定义一个全局函数
void GlobalFunc()
{
	for( int i = 0; i < gN; ++i ) // 访问全局变量
	{
		//...
	}
}
int main()
{
	gN = 3; // 访问全局变量
	GlobalFunc(); // 调用全局函数
	//...
	return 0;
}

extern关键字

C++程序往往被分解为多个源文件和头文件,但是全局作用域内的变量或者函数只在单个源文件范围内可见。可如果想在一个源文件中使用另一个源文件中定义的全局变量应该怎么办?

很简单,只需要使用“extern”关键字将我们需要使用的在其他源文件中已经定义的变量或者函数重新声明一次即可。“extern”关键字表示这是一个扩展(extern)的声明,编译器会在其他源文件中查找这个变量或者函数的具体定义,从而使用同一个变量或者函数。

// Global.cpp:定义全局变量和全局函数
// 用 static 修饰的本地静态函数,只能在当前源文件中使用
static int Power(int n)
{
	return n*n;
}
// 全局变量
int gTotal = 0;
// 全局函数
int PowerSum( int a, int b )
{
	return Power(a) + Power(b);
}

如果想在另外一个源文件中使用这个全局变量和全局函数,就需要用“extern”关键字对它们重新进行声明,然后才可以开始使用:

// main.cpp:使用全局变量和全局函数
// 在变量声明前加上“extern”关键字,重新声明全局变量
extern int gTotal;
// 在函数声明前加上“extern”关键字,重新声明全局函数
extern int PowerSum( int a, int b );
int main()
{
	// 使用全局变量和全局函数
	gTotal = PowerSum( 2, 3 );
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值