C++中将using编译指令用于名称空间
我们并不希望每次使用名称时都对它进行限定,因此C++提供了两种机制(using声明和using 编译指令)来简化对名称空间中名称的使用。using声明使特定的标识符可用,using编译指令使整个名称空间可用。
using 声明由被限定的名称和它前面的关键字 using 组成:
using Jill::fetch; // a using declaration
using 声明将特定的名称添加到它所属的声明区域中。例如 main() 中的 using 声明 Jill::fetch 将 fetch 添加到 main() 定义的声明区域中。完成该声明后,便可以使用名称 fetch 代替 Jill:fetch。下面的代码段说明了这几点:
namespace Jill {
double bucket(double n) { ... }
double fetch;
struct Hill { ... };
}
char fetch;
int main()
{
using Jill::fetch; // put fetch into local namespace
double fetch; // Error!Already have a local fetch
cin >>fetch; // read a value into Jill::fetch
cin >>::fetch; // read a value into global fetch
...
}
由于 using声明将名称添加到局部声明区域中,因此这个示例避免了将另一个局部变量也命名为 fetch.另外,和其他局部变量一样,fetch也将覆盖同名的全局变量。参见【0voice C++】在函数的外面使用 using声明时,将把名称添加到全局名称空间中:
void other();
namespace Jill {
double bucket(double n) { ... }
double fetch;
struct Hill { ... };
}
using Jill::fetch; // put fetch into global namespace
int main()
{
cin >>fetch;// read a value into Jill::fetch
other()
...
}
void other()
{
cout << fetch;// display Jill::fetch
...
}
using 声明使一个名称可用,而 using编译指令使所有的名称都可用。using 编译指令由名称空间名和它前面的关键字 usingnamespace 组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符:
using namespace Jack; //make all the names in Jack available
在全局声明区域中使用using编译指令,将使该名称空间的名称全局可用。这种情况已出现过多次:
#include <iostream> //places names in namespace std
using namespace std; //make names available globally