C 命名空間例項詳解

2022-09-25 22:51:15 字數 1671 閱讀 5242

乙個中大型軟體往往由多名程式設計師共同開發,會使用大量的變數和函式,不可避免地會出現變數或函式的命名衝突。當所有人的**都測試通過,沒有問題時,將它們結合到一起就有可能會出現命名衝突。

例如小李和小韓都參與了乙個檔案管理系統的開發,它們都定義了乙個全域性變數 fp,用來指明當前開啟的檔案,將他們的**整合在一起編譯時,很明顯編譯器會提示 fp 重複定義錯誤。

為了解決合作開發時的命名衝突問題,c++ 引入了命名空間(namespace)的概念。請看下面的例子:

namespace li

namespace han

小李與小韓各自定義了以自己姓氏為名的命名空間,此時再將他們的 fp 變數放在一起編譯就不會有任何問題。

命名空間有時也被稱為名字空間、命名空間。

namespace 是c++中的關鍵字,用來定義乙個命名空間,語法格式為:

namespace name

name是命名空間的名字,它裡面可以包含變數、函式、類、typedef、#define 等,最後由包圍。

使用變數、函式時要指明它們所在的命名空間。以上面的 fp 變數為例,可以這樣來使用:

li::fp = fopen(「one.txt」, 「r」); //使用小李定義的變數 fp

han::fp = fopen(「two.txt」, 「rb+」); //使用小韓定義的變數 fp

::是乙個新符號,稱為域解析操作符,在c++中用來指明要使用的命名空間。

除了直接使用域解析操作符,還可以採用 using 關鍵字宣告,例如:

using li::fp;

fp = fopen(「one.txt」, 「r」); //使用小李定義的變數www.cppcns.com fp

han :: fp = fopen(「two.txt」, 「rb+」); //使用小韓定義的變數 fp

在**的開頭用using宣告了 li::fp,它的意思是,using 宣告以後的程式中如果出現了未指明命名空間的 fp,就使用 li::fp;但是若要使用小韓定義的 fp,仍然需要 han::fp。

using 宣告不僅可以針對命名空間中的乙個變數,也可以用於宣告整個命名空間,例如:

using namespace li;

fp = fopen(「one.txt」, 「r」); //使用小李定義的變數 fp

han::fp = fopen(「two.txt」, 「rb+」); //使用小韓定義的變數 fp

如果命名空間 li 中還定義了其他的變數,那麼同樣具有 fp 變數的效果。在 using 宣告後,如果有未具體指定命名空間的變數產生了命名衝突,那麼預設採用命名空間 li 中的變數。

命名空間內部不僅可以宣告或定義變數,對於其它能在命名空間以外宣告或定義的名稱,同樣也都能在命名空間內部進行宣告或定義,例如類、程式設計客棧函式、typedef、#define 等都可以出現在命名空間中。

站在編譯和鏈結的角度,****現的變數名、函式名、類名等都是一種符號(symbol)。有的符號可以指代乙個記憶體位置,例如變數名、函式名;有的符號僅僅是乙個新的名稱,例如 typedef 定義的型別別名。

下面來看乙個命名空間完整示例**:

#include

//將類定義在命名空間中

namespace diy

}; }

int main()

執行結果:

小明的年齡是 15,成績是 92.500000

程式設計客棧

命名空間詳解(c )

假設我班有倆個同學,一男一女都叫eric,但是如果他倆同時在我面前我只叫eric的話,他倆會不知道我在叫他倆哪位?同樣的,我們將這種現象放在 中。程式設計師對物件命名的時候,一般都會起一些有意義的名稱。在一段 中會現很多的實體,這些實體可能擁有不同的功能,但是他們有同樣的名稱。但是,c 中採用的是單...

C 無名命名空間詳解

將一組宣告包裹在乙個命名空間中就是為了避免可能的名字衝突,保持 的區域性性。例如,一段 示例 include header.h namespace mine int g 但是有時我們並不希望名字mine被區域性的環境之外知道,此時名字mine似乎多餘了,因此我們可以省去這個mine名字 直接改寫為 ...

C 命名空間詳解namespace

命名空間是乙個域,這在個域中所有的型別名字必須是唯一的,不同的型別分組歸入到層次化的命名空間,命名空間的好處是 1 避免名字衝突,2 便於查詢型別名字。如 system.secruity.cryptogtaphy.下面介紹namespace 關鍵字的使用。namespace test class c...