在C++中 我們可以用未命名的名字空間 unnamed namespace 聲明一個(gè)局部于某一文件的實(shí)體,未命名的名字空間以關(guān)鍵字 namespace開(kāi)頭,同為該名字空間是沒(méi)有名字的,所以在關(guān)鍵字namespace后面沒(méi)有名字,而在關(guān)鍵字namespace后面使用花括號(hào)包含聲明塊
?| 12345 | // ----- SortLib.C -----namespace{voidswap(double*d1,double*d2) { }} |
函數(shù)swap()只在文件SortLib.C中可見(jiàn),如果另一個(gè)文件也含有一個(gè)帶有函數(shù)swap()定義的未命名名字空間,則該定義引入的是一個(gè)不同的函數(shù),函數(shù)swap()存在兩種定義但這并不是個(gè)錯(cuò)誤,因?yàn)樗鼈兪遣煌暮瘮?shù),不像其他名字空間,未命名的名字空間的定義局部于一個(gè)特定的文件,不能跨越多個(gè)文本文件。
在 SortLib.C中,在未命名的名字空間的定義之后,我們可以用swap()的簡(jiǎn)短格式引用它,沒(méi)有必要用域操作符引用未命名名字空間的成員 。
?| 123456789 | voidquickSort(double*d1,double*d2) {//...double*elem = d1;//...//引用未命名名字空間成員 swap()swap(d1, elem );//...} |
由于未命名名字空間的成員是程序?qū)嶓w,所以函數(shù) swap()可以在程序整個(gè)執(zhí)行期間被調(diào)用,但是,未命名名字空間成員名只在特定的文件中可見(jiàn)在構(gòu)成程序的其他文件中是不可見(jiàn)的 。
在引入標(biāo)準(zhǔn)C++名字空間之前,解決此類(lèi)聲明局部化問(wèn)題的常見(jiàn)方案是使用從 C語(yǔ)言中繼承來(lái)的關(guān)鍵字static,未命名名字空間的成員與被聲明為static 的全局實(shí)體具有類(lèi)似的特性 。在 C中 被聲明為static的全局實(shí)體在聲明它的文件之外是不可見(jiàn)的 ,例如 在 SortLib.C中的聲明可以按如下形式寫(xiě)成 C程序,它會(huì)提供給swap()相同的特性 。
?| 1234 | // SortLib.C// swap() 在其他程序中不可見(jiàn)staticvoidswap(double*d1,double*d2) { }// sort 函數(shù)定義同前 |
許多 C++實(shí)現(xiàn)都支持全局靜態(tài)聲明,但是,隨著越來(lái)越多的C++實(shí)現(xiàn)都支持名字空間全局靜態(tài)聲明的用法將會(huì)被未命名的名字空間成員所取代。

愛(ài)華網(wǎng)本文地址 » http://www.klfzs.com/a/25101010/18468.html
愛(ài)華網(wǎng)



