C 學習筆記 命名空間

2021-08-03 05:54:04 字數 1875 閱讀 1156

命名空間或者叫名字空間(名字就是namespace)是為了在大型專案中防止識別符號衝突才引入的,實際上就是可以由使用者命名的作用域

touzani的專欄的這篇c++ 命名空間namespace,我覺得寫的很明白(不敢說好壞,因為我也是抱著學習的態度讀技術部落格),該部分大量參考了這篇博文。

原來c++識別符號的作用域:全域性作用域、塊作用域、類作作用域。如果要按範圍大小排個序的話,我的理解是這樣:

塊作用域 < 類作用域 < 全域性作用域

而命名空間介於類作用域與全域性作用域之間。

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

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

定義命名空間:

有名的命名空間:

namespace 命名空間名
無名的命名空間:

namespace
可以在命名空間的定義內,定義命名空間的成員(內部定義)。也可以只在命名空間的定義內宣告成員,而在命名空間的定義之外,定義命名空間的成員(外部定義)。

例如:

namespace outer // 命名空間outer的定義

int i;

void g() // 命名空間inner的成員g()的內部定義,其中的i為inner::i

void h(); // 命名空間inner的成員h()的宣告

}void f(); // 命名空間outer的成員f()的宣告

// namespace inner2; // 錯誤,不能宣告子命名空間

}void outer::f() // 命名空間outer的成員f()的外部定義

void outer::inner::h() // 命名空間inner的成員h()的外部定義

// namespace outer::inner2 // 錯誤,不能在外部定義子命名空間

//

注意:

不能在命名空間的定義中宣告(另乙個巢狀的)子命名空間,只能在命名空間的定義中定義子命名空間。

也不能直接使用「命名空間名::成員名 ……」定義方式,為命名空間新增新成員,而必須先在命名空間的定義中新增新成員的宣告。

另外,命名空間是開放的,即可以隨時把新的成員名稱加入到已有的命名空間之中去。方法是,多次宣告和定義同一命名空間,每次新增自己的新成員和名稱。例如:

namespace a

// 現在a有成員i和f()

namespace a

// 現在a有成員 i、f()、j和g()

使用命名空間:

使用作用域限定符:::

使用using宣告機制:using 命名空間::實體名使用using編譯指令:using namespace 命名空間名;

至於using宣告語句或編譯指令將該實體的可見域擴充套件到什麼程度,這取決於using語句的書寫位置,換言之,這取決於using語句的可見域:

#include 

#include

using

std::string; // using宣告在全域性區域,string全域性可見(不考慮區域性同名覆蓋時)

void display(const

string text)

int main()

C 命名空間學習筆記

三個重要概念 宣告區域 可以在其中進行宣告 變數 函式等 的區域。潛在作用區域 從宣告點開始,至其宣告區域的結尾。作用域 變數對程式而言的可見的範圍。舉個例子 函式中的某個變數可能會被這個函式中的某個 塊中的同名變數隱藏。作用 乙個命名空間中的名稱不會與另乙個命名空間中的相同名稱發生衝突,同時允許程...

C 學習筆記 命名空間

c 包含在全域性命名空間中,使用namespace關鍵字為花括號中的 塊顯示定義命名空間。限定名稱 包含全部的分層資訊。乙個命名空間的 引用另乙個命名空間中定義的名稱,則必須包括該命名空間的引用。舉例 namespace levelone code in global namespace 全域性命名...

C 學習筆記 三十六 命名空間

在 c 應用程式中。例如,您可能會寫乙個名為 xyz 的函式,在另乙個可用的庫中也存在乙個相同的函式 xyz 這樣,編譯器就無法判斷您所使用的是哪乙個 xyz 函式。因此,引入了命名空間這個概念,專門用於解決上面的問題,它可作為附加資訊來區分不同庫中相同名稱的函式 類 變數等。使用了命名空間即定義了...