今天遇到乙個命名空間重定義的問題,程式框架大體如下:
inte***ce中定義的是乙個namespace, 形式如下:
namespade np ;
並且三個module(1,2,3),以及core模組全都需要引用這個命名空間中的資料(與訊息傳遞有關),並且這幾個模組是分別編譯的,最後鏈結起來,編譯module1, module2, module3, core時沒有問題, 但是在鏈結時由於重複包含了inte***ce.h標頭檔案,其中的命名空間中的成員出現了重複定義的問題,這個命名空間預設是external鏈結屬性的,所以各模組對該命名空間成員的引用出現重定義。
解決方案也很簡單:用匿名命名空間把這個重定義的命名空間包起來即可,效果如下:
namespace ;
};
原理:
匿名的命名空間具有internal鏈結屬性(同static),只能在本檔案中訪問(其他檔案也訪問不了,因為不知道命名空間的名字下面的unique),本檔案是知道匿名空間的名字的(預設新增),效果大概是
namespaceunique_name ;
};using namespace unique_name; /* 由於這句自動新增 ,所以對名字空間中成員的使用不用作更改,如np1::a, 使用匿名空間,只需要用namespace包起來即可,比較方便*/
對名字空間中成員的使用不用作更改,如np1::a, 使用匿名空間,只需要用namespace包起來由於具有了internal訪問的屬性,不管幾個檔案包含這個命名空間也不會衝突(只在各自檔案中可見),不會在全域性衝突。本文是使用匿名命名空間解決命名空間重定義的問題,其他重定義的問題沒有測試,這種解決方案可能具體侷限性。 C 匿名命名空間
當定義乙個命名空間時,可以忽略這個命名空間的名稱 namespce 編譯器在內部會為這個命名空間生成乙個唯一的名字,而且還會為這個匿名的命名空間生成一條using指令。所以上面的 在效果上等同於 namespace unique name using namespace unique name 在匿...
C 命名空間 預設命名空間與匿名命名空間
2.匿名命名空間 預設命名空間也叫全域性命名空間,所有沒有置於某一具體命名空間下的 即在預設命名空間下,例如func main 函式。include void func void intmain int argc,char ar void func void 需要注意的是 這個就是類似於c語言裡簡單...
C 學習(十)匿名命名空間
匿名的空間是c 用於替代使用static定義作用域為本編譯單元的全域性函式或全域性變數的一種新的替代方式,匿名空間與命名的命名空間一樣可以巢狀。由於匿名命名空間沒有命名空間的名字,所以也無法在其它的編譯單元內通過extern宣告該變數,於是該變數自然也只在本編譯單元內可見。當定義乙個命名空間時,可以...