當定義乙個命名空間時,可以忽略這個命名空間的名稱:
namespce
編譯器在內部會為這個命名空間生成乙個唯一的名字,而且還會為這個匿名的命名空間生成一條using指令。所以上面的**在效果上等同於:
namespace __unique_name_
using namespace __unique_name_;
在匿名命名空間中宣告的名稱也將被編譯器轉換,與編譯器為這個匿名命名空間生成的唯一內部名稱(即這裡的__unique_name_)繫結在一起。還有一點很重要,就是這些名稱具有internal鏈結屬性,這和宣告為static的全域性名稱的鏈結屬性是相同的,即名稱的作用域被限制在當前檔案中,無法通過在另外的檔案中使用extern宣告來進行鏈結。如果不提倡使用全域性static宣告乙個名稱擁有internal鏈結屬性,則匿名命名空間可以作為一種更好的達到相同效果的方法。
注意:命名空間都是具有external 連線屬性的,只是匿名的命名空間產生的__unique_name__在別的檔案中無法得到,這個唯一的名字是不可見的.
c++ 新的標準中提倡使用匿名命名空間,而不推薦使用static,因為static用在不同的地方,涵義不同,容易造成混淆.另外,static不能修飾class
作用可以描述為:防止乙個編譯單元內部的區域性宣告被外部訪問
**:注:原文可能無法訪問,如果無法訪問,
這裡
C 命名空間 預設命名空間與匿名命名空間
2.匿名命名空間 預設命名空間也叫全域性命名空間,所有沒有置於某一具體命名空間下的 即在預設命名空間下,例如func main 函式。include void func void intmain int argc,char ar void func void 需要注意的是 這個就是類似於c語言裡簡單...
C 學習(十)匿名命名空間
匿名的空間是c 用於替代使用static定義作用域為本編譯單元的全域性函式或全域性變數的一種新的替代方式,匿名空間與命名的命名空間一樣可以巢狀。由於匿名命名空間沒有命名空間的名字,所以也無法在其它的編譯單元內通過extern宣告該變數,於是該變數自然也只在本編譯單元內可見。當定義乙個命名空間時,可以...
解決C 重定義問題 匿名命名空間
今天遇到乙個命名空間重定義的問題,程式框架大體如下 inte ce中定義的是乙個namespace,形式如下 namespade np 並且三個module 1,2,3 以及core模組全都需要引用這個命名空間中的資料 與訊息傳遞有關 並且這幾個模組是分別編譯的,最後鏈結起來,編譯module1,m...