C namespace命名空間詳解

2021-12-30 01:20:23 字數 2157 閱讀 4076

命名空間

在c++中,名稱(name)可以是符號常量、變數、巨集、函式、結構、列舉、類和物件等等。為了避免,在大規模程式的設計中,以及在程式設計師使用各種各樣的c++庫時,這些識別符號的命名發生衝突,標準c++引入了關鍵字namespace(命名空間/名字空間/命名空間/名域),可以更好地控制識別符號的作用域。

mfc中並沒有使用命名空間,但是在.net框架、mc++和c++/cli中,都大量使用了命名空間。

1)作用域與命名空間

l相關概念

與命名空間相關的概念有:

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

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

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

l命名空間

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

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

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

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

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

2)定義命名空間

有兩種形式的命名空間——有名的和無名的。

命名空間的定義格式為:(取自c++標準文件)

named-namespace-definition:

namespace identifier

unnamed-namespace-definition:

namespace

namespace-body:

declaration-seqopt

即:(自己翻譯並改寫的)

有名的命名空間:

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

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()

還可以用多種方法,來組合現有的命名空間,讓它們為我所用。例如:

namespace my_lib

int main() {

i = 0; //可直接使用無名命名空間中的成員i

f(); //可直接使用無名命名空間中的成員f()

c namespace 命名空間

using namespace std using編譯指令,它會一次性把std空間中的所有實體全部引進來 namespace wd end of namespace wd namespace tls end of namespace tls int main void using std cout ...

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

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

spring p命名空間 c命名空間

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