C 的命名空間

2021-07-10 12:55:47 字數 1334 閱讀 2982

1、命名空間的由來

乙個程式由多個模組組成,而不同的模組中全域性變數名或函式名相同的問題不可避免,這將會產生鏈結錯誤。c++中引入命名空間的概念就是為了解決名稱衝突問題。

2、命名空間的本質(個人觀點):

乙個命名空間是乙個作用域,使用它來宣告一批名稱(變數名,類名,函式名)來自該空間,以唯一地確定這些名稱。

3、命名空間的定義

1)命名空間以關鍵字namespace開始,後面跟命名空間的名稱,如

namespace nokia;

class phone;

...}  //沒有分號

那麼nokia這個命名空間就有了兩個成員:類call和類phone。一般出現在標頭檔案中,可以理解為將乙個的標頭檔案的頭尾用namespace nokia括起來,這樣這些名稱的集合就有了乙個名字叫作namespace nokia。

2)由於命名空間是可以不連續的,所以可以用分離的介面檔案和實現檔案構成命名空間。上面已經在介面檔案(.h)中定義了命名空間和它的成員。那麼命名空間中成員的實現可以放在原始檔(.c)中。而且該命名空間還可以出現在其他檔案中,最終nokia這個命名空間的成員是所有部分的集合。

3)顯示指定的命名空間也可以是未命名的,也就是namespace 這種形式,只是這種命名空間不能跨檔案,沒有統一的名字,沒法合併嘛。未命名的命名空間可以取代檔案中的靜態宣告。

4)特別的,程式設計師可以顯示地將一批名稱圈定在自己的命名空間中,還有一些名稱游離在各個命名空間之外,也就是全域性名稱,難道這些全域性名稱就沒有人管,沒有人罩著嗎,其實還有乙個隱藏的全域性命名空間呢,只是它沒有名字,顯得非常神秘而已。

4、命名空間的使用

1)每次都使用作用域限定符:

nokia::call mycall = new nokia::call;  //這樣是不是太麻煩了

2)一次只引入乙個命名空間成員:

using nokia::call;

using nokia::phone;

::g_resource;   //全域性命名空間成員,其實就是全域性變數

call mycall = new call;        //比第一種方法省事一些,但是如果引入的成員多,也挺麻煩

3)引入命名空間所有成員:

using namespace nokia;         //一勞永逸,但是範圍太大,如果引入的多個命名空間有重名的,那又是名稱衝突了

using namespace std;

5、巢狀命名空間:

當庫的提供者需要防止庫中每一部分和其他部分的名字衝突時,巢狀命名空間是很有用的。

spring p命名空間 c命名空間

p命名空間 1.需要引入命名空間p 並不真實存在 是在spring內部中實現的 xmlns p 2.如果是引用注入需要加 ref字尾 p和c命名空間 並不適用於集合引數 c命名空間 1.需要引入命名空間c 並不真實存在 是在spring內部中實現的 xmlns c 2.可以使用c 引數名 或c 引數...

c 中regex的命名空間 c 命名空間

system.transactions 命名空間 注意 此命名空間在 net framework 2.0 版中是新增的。使用 system.transactions 命名空間包含的類可以編寫自己的事務應用程式和資源管理器。具體地說,可以建立和參與 與乙個或多個參與者 本地或分布式事務。system....

C 命名空間 預設命名空間與匿名命名空間

2.匿名命名空間 預設命名空間也叫全域性命名空間,所有沒有置於某一具體命名空間下的 即在預設命名空間下,例如func main 函式。include void func void intmain int argc,char ar void func void 需要注意的是 這個就是類似於c語言裡簡單...