在c++中,名稱(name)可以是符號常量、變數、函式、結構、列舉、類和物件等等。工程越大,名稱互相衝突性的可能性越大。另外使用多個廠商的類庫時,也可能導致名稱衝突。為了避免,在大規模程式的設計中,以及在程式設計師使用各種各樣的c++庫時,這些識別符號的命名發生衝突,標準c++引入關鍵字namespace(命名空間/名字空間/命名空間),可以更好地控制識別符號的作用域。
建立乙個命名空間:
namespaceanamespace
bvoid
test()
命名空間只能全域性範圍內定義(以下錯誤寫法)
voidtest()
namespace
b cout
<< "
a::a :
"<< a::a
<< "
b::a :
"<< b::a <}
命名空間可巢狀命名空間
namespacea}void
test()
命名空間是開放的,即可以隨時把新的成員加入已有的命名空間中
namespaceanamespacea}
void
test()
宣告和實現可分離
#pragma oncenamespace
myspace
voidmyspace::func1()
void myspace::func2(int
param)
無名命名空間,意味著命名空間中的識別符號只能在本檔案內訪問,相當於給這個識別符號加上了static,使得其可以作為內部連線
namespace}void
test()
命名空間別名
namespaceverylongname
}void
test()
using宣告
using宣告可使得指定的識別符號可用。
namespacea
void funcb()
}void
test()
using宣告碰到函式過載
如果命名空間包含一組用相同名字過載的函式,using宣告就宣告了這個過載函式的所有集合。
1namespacea3
void func(int
x){}
4int func(int x,int y)5}
6void
test()
using編譯指令
using編譯指令使整個命名空間識別符號可用.
注意:使用using宣告或using編譯指令會增加命名衝突的可能性。也就是說,如果有命名空間,並在**中使用作用域解析運算子,則不會出現二義性。
namespacea
void funcb()
}void
test01()
namespace
b
void funcb()
}void
test02()
需要記住的關鍵問題是當引入乙個全域性的using編譯指令時,就為該檔案開啟了該命名空間,它不會影響任何其他的檔案,所以可以在每乙個實現檔案中調整對命名空間的控制。
比如,如果發現某乙個實現檔案中有太多的using指令而產生的命名衝突,就要對該檔案做個簡單的改變,通過明確的限定或者using宣告來消除名字衝突,這樣不需要修改其他的實現檔案。
C 命名空間namespace
在c 中,名稱 name 可以是符號常量 變數 巨集 函式 結構 列舉 類和物件等等。為了避免,在大規模程式的設計中,以及在程式設計師使用各種各樣的c 庫時,這些識別符號的命名發生衝突,標準c 引入了關鍵字namespace 命名空間 名字空間 命名空間 名域 可以更好地控制識別符號的作用域。mfc...
C 命名空間 (Namespace)
命名空間的設計目的是提供一種讓一組名稱與其他名稱分隔開的方式。在乙個命名空間中宣告的類的名稱與另乙個命名空間中宣告的相同的類的名稱不衝突。命名空間的定義是以關鍵字 namespace 開始,後跟命名空間的名稱,如下所示 csharp view plain copy namespace namespa...
C 命名空間(Namespace)
命名空間的設計目的是提供一種讓一組名稱與其他名稱分隔開的方式。在乙個命名空間中宣告的類的名稱與另乙個命名空間中宣告的相同的類的名稱不衝突。命名空間的定義是以關鍵字namespace開始,後跟命名空間的名稱,如下所示 namespace namespace name 為了呼叫支援命名空間版本的函式或變...