目錄
嵌套式名稱空間
拓展——未命名的名稱空間
嵌套式名稱空間
示例代碼1:
namespace electronicEquipment
{namespace computer{double price = 4999.0;string modelNumber;string name;}namespace ElectronicWatch{double price = 99.0;string modelNumber;string name;}int equipmentNumber;
}
如果要使用computer名稱空間中名稱,則需要使用的using編譯指令為:
using namespace electronicEquipment::computer;
在名稱空間中使用using編譯指令,示例程序2:
#include <iostream>
#include <string>
using namespace std;namespace book
{double price = 19.9;std::string series;std::string name;
}namespace electronicEquipment
{using namespace book;namespace computer{double price = 4999.0;string modelNumber;string name;}namespace ElectronicWatch{double price = 99.0;string modelNumber;string name;}int equipmentNumber;
}int main()
{using namespace electronicEquipment;double a= price;cout << "a=" << a << endl;return 0;
}
main()函數輸出結果為19.9,輸出的是名稱空間book中的price。
說明:using編譯指令是可傳遞的。如果A op B且B op C,如果A op C成立,那么我們說操作op是可傳遞的。例如:大于操作符是可傳遞的,因為A>B,B>C,則A>C成立。
所以當electronicEquipment名稱空間中包含了名稱空間book,且book名稱空間中又有price,則相當于electronicEquipment名稱空間包含了名稱price,因此輸出的price是book名稱空間中的。
由于名稱空間electronicEquipment的聲明中添加了使用book名稱空間的編譯指令,因此,編譯指令using namespace electronicEquipment;和下面兩條語句等價。
using namespace electronicEquipment;
using namespace book;
拓展——未命名的名稱空間
可以通過省略名稱空間的名稱來創建未命名的名稱空間,例如,將示例程序2中的book名稱空間名稱空間名省略。
namespace
{double price = 19.9;std::string series;std::string name;
}
當省略名稱空間名后,該名稱空間中的名稱的作用域為:從聲明點到該聲明區域末尾,從這一點看,它與全局變量相似。但是由于沒有名稱空間名,它無法顯式的使用using編譯指令來使它在其他地方可用,即它無法在其他文件中使用。因此,這種方法只能替代鏈接性為內部的靜態變量。(事實上,最新的C++標準中已經指出不贊成在名稱空間和全局作用域中使用關鍵字static,雖然目前合法,但以后的修訂標準很可能視為非法)