目录
嵌套式名称空间
拓展——未命名的名称空间
嵌套式名称空间
示例代码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,虽然目前合法,但以后的修订标准很可能视为非法)