1. 程式人生 > >作用域與可見性、extern

作用域與可見性、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;
}