1. 嵌套的命名空間
命名空間可以嵌套,嵌套的命名空間可以進一步改進庫中代碼的組織。
namespace cplusplus_primer { namespace QueryLib { class Query { /* … */ }; // … } namespace Bookstore { class Item_base { /* … */ }; // … } }
當需要防止庫中每個部分的名字與庫中其他部分的名字沖突的時候,嵌套命名空間是很有用的。使用時,類Query的完全限定名如下:cplusplus_primer::QueryLib::Query。
2. 匿名的命名空間
匿名的命名空間可以在給定文件中不連續,但不能跨越多個文件。
匿名的命名空間用於聲明局部於文件的實體,在匿名的命名空間中定義的變量在程序開始時創建,在程序結束時一直存在。
匿名的命名空間中定義的名字可直接使用,沒有完全限定名。
匿名的命名空間中定義的名字只在本文件中可見。
匿名的命名空間中定義的名字可以在定義該命名空間所在的作用域中可見,如果在文件的最外層作用域中定義匿名的命名空間,那么該匿名的命名空間中的名字必須與全局作用域中的名字不同。
int i; namespace { int i; } i = 10; // error: ambiguous defined globally and in an unnested, unnamed namespace
匿名的命名空間可以嵌套在另一個命名空間內部。
namespace local { namespace { int i; } } // ok: i defined in a nested unnamed namespace is distinct from global i local::i = 42;
注意:如果頭文件定義了匿名的命名空間,那么在每個包含該頭文件的文件中,都將定義該名字的不同的局部實體。
匿名的命名空間有一個重要的用處,就是取代文件中的靜態聲明。在c語言中,程序必須將名字聲明為static,才可以使其局部於一個文件,而對其它的文件不可見。c++繼承了這個特性,但c++不贊成這種文件靜態聲明。不贊成的特性就可能會在未來的版本中不支持,所以應該使用匿名的命名空間來代替static靜態聲明。
【學習資料】
《c++ primer》
