這個(gè)namespace是干啥的呢?這個(gè)詞的中文意思就是命名空間,它主要是提供了一個(gè)域,這個(gè)域中出現(xiàn)的名字不與其他域中的名字產(chǎn)生沖突吕粗。
一個(gè)域中的名稱可以被外界引用這說明這些名字具有外部連接屬性,當(dāng)然常量默認(rèn)情況下還是僅具有內(nèi)部連接屬性的旭愧,為什么呢溯泣?那就要看這里了。
你可以在程序中引入既有命名空間中的名字榕茧,只要使用using聲明即可,比如下圖所示:
引入一次即可客给,然后你就可以直接使用了用押。如果使用域中存在同名變量,那么會出現(xiàn)錯(cuò)誤靶剑,因?yàn)榫幾g器會認(rèn)為這是對該namespace中的同名變量進(jìn)行二次聲明或定義蜻拨,會犯多重定義的錯(cuò)誤。如下圖所示:
所以說using指令是一個(gè)聲明式桩引,在某個(gè)域中它是唯一的缎讼。
而你單純地使用域操作符是另外一回事,你使用域操作符只不過是使用namespace中的成員而已坑匠,但是它的優(yōu)先級沒有本地變量高血崭,如果有本地同名變量,namespace中的變量會被屏蔽厘灼。如下圖所示:
所以如果你確實(shí)想使用namespace中的成員夹纫,那你用using可以確保你就是使用它。
另外一個(gè)就是使用using
namespace指令设凹,后面加上你要引用的命名空間的名稱舰讹,它使得該命名空間的所有名稱都可見。如果你把這個(gè)指令放在了全局域中闪朱,那么它就到處都可見了月匣。比如下圖所示:
這里有幾點(diǎn)需要注意的。1奋姿、如果在同級域中已經(jīng)存在了一個(gè)本地name锄开,那你就不能再使用using來引進(jìn)這個(gè)name了。如果你確實(shí)這么做了称诗,本地name會屏蔽namespace中的name院刁。
不過經(jīng)過驗(yàn)證似乎現(xiàn)在的VS中的namespace只能在內(nèi)部進(jìn)行聲明,而不能在外部粪狼。在外部只能是引用該namespace中的成員而已退腥。
2任岸、當(dāng)你在一個(gè)同級域中,通過using namespace引入一個(gè)命名空間狡刘,并且這個(gè)命名空間中的名稱和本地變量名稱一樣時(shí)享潜,該namespace中的名稱會被屏蔽,除非你加限定符明確指出來嗅蔬。
在這里全局域直接用域操作符來分辨剑按,下面看個(gè)例子。
一般來說澜术,全局性地使用using
namespace xxx艺蝴;會使該namespace中的成員遍布整個(gè)程序,這樣你都搞不清楚哪些是你添加進(jìn)去的鸟废。所以推薦的使用方式是在特定的作用域中使用using
namespace指令猜敢,或者使用命名空間名稱+域操作符來引用命名空間成員。這個(gè)限制是C++ Primer Plus中所說的盒延。
不過缩擂,我個(gè)人認(rèn)為,現(xiàn)在的C++不允許你在namespace之外聲明新的name添寺,因此你不可能在外面引入新的name胯盯,而不讓你隨便使用全局性質(zhì)的namespace的原因可能是怕你分不清哪些是該namespace中的名字吧。而如果某些系統(tǒng)不支持命名空間的話计露,你可以完全只使用頭文件博脑。
Namespace是可以嵌套的。
你可以給namespace起個(gè)別名票罐,方便使用和記憶趋厉,方法如下:
無名namespace。這種命名空間只能現(xiàn)聲明現(xiàn)用胶坠,它往往局限于某個(gè)作用域中之內(nèi)君账。因?yàn)闆]名所以你不能顯式引用它的成員,也不具有外部連接屬性沈善,它相當(dāng)于文件域中的static變量乡数。它是作為本文件中static變量的替代方案而存在的。