神奇的namespace使用

2021-09-27 09:28:49 字數 3482 閱讀 3096

相關概念

宣告域(declaration region)—— 宣告識別符號的區域。如在函式外面宣告的全域性變數,它的宣告域為宣告所在的檔案。在函式內宣告的區域性變數,它的宣告域為宣告所在的**塊(例如整個函式體或整個復合語句)。

潛在作用域(potential scope)—— 從宣告點開始,到宣告域的末尾的區域。因為c++採用的是先宣告後使用的原則,所以在宣告點之前的宣告域中,識別符號是不能用的。即,識別符號的潛在作用域,一般會小於其宣告域。

作用域(scope)—— 識別符號對程式可見的範圍。識別符號在其潛在作用域內,並非在任何地方都是可見的。例如,區域性變數可以遮蔽全域性變數、巢狀層次中的內層變數可以遮蔽外層變數,從而被遮蔽的全域性或外層變數在其倍遮蔽的區域內是不可見的。所以,乙個識別符號的作用域可能小於其潛在作用域。

命名空間

命名空間(namespace)是一種描述邏輯分組的機制,可以將按某些標準在邏輯上屬於同乙個集團的宣告放在同乙個命名空間中。

原來c++識別符號的作用域分成**:**塊(,如復合語句和函式體)、類和全域性。現在,在其中的類和全域性之間,標準c++又新增了命名空間這乙個作用域級別。

命名空間可以是全域性的,也可以位於另乙個命名空間之中,但是不能位於類和**塊中。所以,在命名空間中宣告的名稱(識別符號),預設具有外部鏈結特性(除非它引用了常量)。

在所有命名空間之外,還存在乙個全域性命名空間,它對應於檔案級的宣告域。因此,在命名空間機制中,原來的全域性變數,現在被認為位於全域性命名空間中。

標準c++庫(不包括標準c庫)中所包含的所有內容(包括常量、變數、結構、類和函式等)都被定義在命名空間std(standard標準)中了。

好吧,接下來才是我想說的:

我們在oier歷程中常見到(甚至閉眼就能碼出來):

using namespace std;

but........what is "namespace"?

namespace中文意思是命名空間或者叫名字空間,傳統的c++只有乙個全域性的namespace,但是由於現在的程式的規模越來越大,程式的分工越來越細,全域性作用域變得越來越擁擠,每個人都可能使用相同的名字來實現不同的庫,於是程式設計師在合併程式的時候就會可能出現名字的衝突。namespace引入了複雜性,解決了這個問題。namespace允許像類,物件,函式聚集在乙個名字下。本質上講namespace是對全域性作用域的細分。

概念如上,其實就是把變數宣告分類;以便變數重名的區分

例如: 

第一天我定義了乙個變數var,許多天後天我忘記了第一天是否定義過了變數var,

此時如果我再定義一遍會出錯,怎呢辦?

我可以把第一天的變數var放到day1中,把以後的var變數放到day2中

用day1::var或day2::var呼叫,就不會出現問題了!

end怎樣定義命名空間?方法如下:

有名的命名空間:

namespace 命名空間名

namespace

using的作用就是將某個命名空間放到全域性,可以直接呼叫(匯入預設空間)。

#include using namespace std;

int main()

我想很多人對namespace的了解也就這麼多了

但是namespace遠不止如此,讓我們再多了解一下namespace

namespace的格式基本格式是

namespace identifier

舉個例子,

namespace exp

為了在namespace外使用namespace內的變數我們使用::操作符,如下

exp::a

exp::b

使用namespace可以有效的避免重定義的問題

#include using namespace std;

namespace first

namespace second

int main ()

結果是5

3.1416

兩個全域性變數都是名字都是var,但是他們不在同乙個namespace中所以沒有衝突。

關鍵字using可以幫助從namespace中引入名字到當前的宣告區域

#include using namespace std;

namespace first

namespace second

int main ()

輸出是5

2.7183

103.1416

就如我們所指定的第乙個x是first::x,y是second.y

using也可以匯入整個的namespace

#include using namespace std;

namespace first

namespace second

int main ()

輸出是5

103.1416

2.7183

正如我們所預見的匯入的整個的first的namespace,前一對x,y的值就是first中的x,y的值。

這裡我們不能在「using namespace first;「下加一句「using namespace second;「,為什麼呢?

這樣做無異於直接完全的忽視namespace first和namespace second,會出現重複定義的結果,所以前面的hello_world.c中的using指令的使用一定程度上存在問題的,只是因為我們就用了乙個namspace,一旦引入了新的namespace這種做法很可能會出現重複定義的問題。

在標頭檔案中,我們通常堅持使用顯式的限定,並且僅將using指令侷限在很小的作用域中,這樣他們的效用就會受到限制並且易於使用。類似的例子有

#include using namespace std;

namespace first

namespace second

int main ()

return 0;

}

輸出是5

3.1416

可以看到兩個不同的namespace都被限制在了不同作用域中了,他們之間就沒有衝突。

namespace也支援巢狀

#include namespace first 

void second::hello()

//這裡的count是唯一的

//在程式的其它部分中count是有效的

void chg_cnt (int i)

c 的namespace使用經驗

這幾天剛開始看c 其namespace部分困住了我一會,經過多處查詢資料,終於弄明白,現將經驗整理如下 比如我在 namespace n1 裡建乙個類a,裡面有幾個方法,然後在 ns2.cs裡引用n1,並且呼叫其中的方法。簡單 如下 ns1.cs using system namespace n1 ...

C 中namespace的使用

c 中經常會使用到namespace關鍵字,那麼到底什麼是namespace呢?它有什麼用呢?namespace直譯就是命名空間的意思,它是一種邏輯分組機制,將按照某些標準在邏輯上屬於同乙個任務的所有類宣告放在同乙個命名空間。最常用到的using namespace std就是在標準c 中所有包含的...

C 命名空間namespace的使用

namespace中文意思是命名空間或者叫名字空間,傳統的c 只有乙個全域性的namespace,但是由於現在的程式的規模越來越大,程式的分工越來越細,全域性作用域變得越來越擁擠,每個人都可能使用相同的名字來實現不同的庫,於是程式設計師在合併程式的時候就會可能出現名字的衝突。namespace引入了...