1. 程式人生 > >C++匿名名字空間

C++匿名名字空間

解決問題 AC arrow 不同的 不同 等價 方便 程序員 麻煩

轉自:http://blog.csdn.net/eric_arrow/article/details/8978905

名字空間(namespace),是C++提供的一個解決符合名字沖突的特性。標準規定,在不同名字空間中命名相同的符號,代表不同的實體。通常,利用定義名字空間的辦法,可以使模塊劃分更加方便,減少模塊間的相互影響。
通常定義一個名為MyNameSpace的名字空間,其形式為:

1namespace MyNameSpace
2{
3}

如果不寫MyNameSpace,在C++裏也是允許的,這就是匿名名字空間。按照標準的描述,匿名名字空間等價於:

1namespace unique
2{
3}
4using

namespace unique;

這裏的unique由編譯器決定,並保證這是一個在程序裏唯一的名字空間。

因此,可以看出,匿名名字空間具有一個很有用的特性,那就是,對於不同的編譯單元(cpp文件),“同一個”匿名名字空間中的對象,會被當作不同的實體。而這個特性和全局的static修飾是一致的。那這能帶來什麽好處呢?原有的static不是很好用的嗎?

是的,static修飾,在處理函數和變量(包括常量)的時候已經工作得很好了。但是static的缺陷是不能修飾class和struct這樣的結構定義。因此,當出現這種情況: 在某個cpp實現裏需要輔助的幾個結構a,b,c來幫助實現,但是又不希望這些結構汙染整個名字空間。這時一般有如下兩種解決辦法:

1)定義一個不常用的名字空間,將a, b, c 放入其中。
這樣,需要程序員自己保證名字空間的名字唯一。
2)使用類內部結構體定義。
這樣,如果結構比較復雜,比如,有靜態成員,就行不通了。而且如果這些結構不是一個類獨自使用而需要幾個類共享,處理起來也比較麻煩。

這時,如果使用匿名名字空間,就可以比較完美解決問題了。

【總結】: 匿名名字空間提供了類似在全局函數前加 static 修飾帶來的限制作用域的功能。它的這種特性可以被用在struct和class上, 而普通的static卻不能。

C++匿名名字空間