C 中的命名空間

2021-07-02 00:51:52 字數 1374 閱讀 1240

在c++語言中,命名空間是一種實體,使用namespace來宣告,並使用來界定命名空間的作用域。

namespace foo

命名空間對應於命名空間作用域。和c語言的檔案作用域相容,c++具有全域性命名空間作用域,對應的命名空間是全域性命名空間,不需要宣告。用字首為::的qualified-id顯式引用全域性命名空間作用域中的名稱,此外也有特別的用法。例如,::operator new指稱全域性new運算子;而::new指稱new表示式使用全域性::operator new為建立的物件分配儲存。

命名空間可以在另一命名空間之中巢狀宣告;但不能宣告在類和**塊之中。在命名空間中宣告的名稱,預設具有外部鏈結(除非宣告的是const物件,它預設是具有內部鏈結)。

按照是否有名字,可分為有名字的命名空間與無名命名空間。後者的宣告為:

namespace

實現會選取乙個和其它命名空間名稱都不一樣的唯一隱含名稱為其命名。無名命名空間的成員在本翻譯單元中可以不加顯式引用(實際上也沒法顯式引用無名命名空間)而直接使用;但在其他翻譯單元中不可見。儘管無名命名空間中的名稱仍然具有預設的外部鏈結,但因為無法和其它命名空間中的名稱一樣被跨翻譯單元引用,可以和靜態鏈結的名稱類似被優化。

命名空間的成員,是在命名空間體的花括號內宣告了的名稱。可以在命名空間體之外,給出命名空間成員的定義。即命名空間的成員宣告與定義可以分開。

子命名空間必須定義在上層命名空間體之內。禁止把子命名空間的宣告與定義分開。

不能以「命名空間名::成員名;」方式,在命名空間體之外為命名空間新增新成員。必須在命名空間體之中新增新成員的宣告。

可以多次宣告和定義同一命名空間,每次給這一命名空間新增新成員。同名的命名空間即便在宣告位置不同,仍然是同乙個實體。

可以在乙個命名空間中引入其他命名空間的成員。例如:

namespace mynamespace

引用命名空間的成員,有下述辦法:

命名空間可以有別名:namespace 別名 = 命名空間名;這使得名字較長的命名空間可以方便地用較短的別名來引用。

c++11起支援內聯命名空間。使用inline namespace作為宣告的起始。內聯命名空間的名稱在名稱查詢時被特別對待,使用qualified-id引用其中的名稱時,被內聯的命名空間名稱可以省略。實用上,內聯命名空間可以在修改命名空間名稱的同時避免在二進位制檔案中生成的符號改變,因此不同內聯命名空間的名稱可以用於標識介面相容的不同版本,有助於保持二進位制相容性。這也在標準庫的實現中被使用,如libstdc++和libc++。

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

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

C 中的命名空間

命名空間是什麼?為什麼需要命名空間?c語言中所有的全域性識別符號共享同乙個作用域 識別符號之間可能發生衝突 在實際工程專案開發中,並不是又乙個人編寫全部 的,而是分多人合作寫同乙個專案。但是由於c語言的這種特性,不同的人可能定義同名的全域性變數,導致全域性變數發生衝突。所以一般用c編寫 盡量少用全域...

C 中的命名空間(namespace)

c 中的命名空間 namespace 為了解決這一問題,c 提出了命名空間機制,所謂命名空間即使有程式設計師命名的記憶體區域,程式設計師可以根據需要指定有名的記憶體空間用來存放指定的實體。把一些全域性實體分別存放在不太的命名空間中,從而與其他全域性實體分隔開來,這樣編譯器就可以根據不同的命名空間區分...