轉(zhuǎn)載自:http://hi.baidu.com/thinapple/blog/item/049df24f6d30bc3eaec3aba7.html
? ? 名字空間(namespace),是C++提供的一個解決符合名字沖突的特性梁只。標(biāo)準(zhǔn)規(guī)定昧碉,在不同名字空間中命名相同的符號,代表不同的實體诗赌。通常耘眨,利用定義名字空間的辦法,可以使模塊劃分更加方便境肾,減少模塊間的相互影響剔难。
? ? 通常定義一個名為MyNameSpace的名字空間,其形式為:
namespace MyNameSpace
{
? ? ...
}
? ? 如果不寫MyNameSpace奥喻,在C++里也是允許的偶宫,這就是匿名名字空間。按照標(biāo)準(zhǔn)的描述环鲤,匿名名字空間等價于:
namespace unique
{
? ? ...
}
using?namespace unique;
? ? 這里的unique由編譯器決定纯趋,并保證這是一個在程序里唯一的名字空間。
? ? 因此,可以看出吵冒,匿名名字空間具有一個很有用的特性纯命,那就是,對于不同的編譯單元(cpp文件)痹栖,“同一個”匿名名字空間中的對象亿汞,會被當(dāng)作不同的實體。而這個特性和全局的static修飾是一致的揪阿。那這能帶來什么好處呢疗我?原有的static不是很好用的嗎?
? ? 是的南捂,static修飾吴裤,在處理函數(shù)和變量(包括常量)的時候已經(jīng)工作得很好了。但是static的缺陷是不能修飾class和struct這樣的結(jié)構(gòu)定義溺健。因此麦牺,當(dāng)出現(xiàn)這種情況: 在某個cpp實現(xiàn)里需要輔助的幾個結(jié)構(gòu)a,b,c來幫助實現(xiàn),但是又不希望這些結(jié)構(gòu)污染整個名字空間鞭缭。這時一般有如下兩種解決辦法:
1)定義一個不常用的名字空間剖膳,將a, b, c 放入其中。
這樣缚去,需要程序員自己保證名字空間的名字唯一潮秘。
2)使用類內(nèi)部結(jié)構(gòu)體定義。
這樣易结,如果結(jié)構(gòu)比較復(fù)雜枕荞,比如,有靜態(tài)成員搞动,就行不通了躏精。而且如果這些結(jié)構(gòu)不是一個類獨自使用而需要幾個類共享,處理起來也比較麻煩鹦肿。
這時矗烛,如果使用匿名名字空間,就可以比較完美解決問題了箩溃。
【總結(jié)】: 匿名名字空間提供了類似在全局函數(shù)前加 static 修飾帶來的限制作用域的功能瞭吃。它的這種特性可以被用在struct和class上, 而普通的static卻不能涣旨。