C++中未命名的名称空间的用法详解
可以通过省略名称空间的名称来创建未命名的名称空间:
namespace //unnamed namespace
{
int ice;
int bandycoot;
}
这就像后面跟着 using 编译指令一样,也就是说,在该名称空间中声明的名称的潜在作用域为:从声明点到该声明区域末尾。从这个方面看,它们与全局变量相似。然而,由于这种名称空间没有名称,因此不能显式地使用using 编译指令或 using 声明来使它在其他位置都可用。具体地说,不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称。这提供了链接性为内部的静态变量的替代品。例如,假设有这样的代码:
static int counts; // static storage, internal linkage
int other();
int main()
{
...
}
int other()
{
...
}
采用名称空间的方法如下:
namespace
{
int counts; //static storage,internal linkage
}
int other();
int main()
{
...
}
int other()
{
...
}
一般说来,使用 using 声明比使用 using编译指令更安全,这是由于它只导入指定的名称。如果该名称与局部名称发生冲突,编译器将发出指示。参见【0voice C++】using编译指令导入所有名称,包括可能并不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器并不会发出警告。另外,名称空间的开放性意味着名称空间的名称可能分散在多个地方,这使得难以准确知道添加了哪些名称。
下面是大部分示例采用的方法:
#include <iostream>
int main()
using namespace std;
首先,#include语句将头文件iostream放到名称空间std中。然后,using编译指令是该名称空间在 main()函数中可用。有些示例采取下述方式:
#include <iostream>
using namespace std;
int main()
{
...
}
这将名称空间std中的所有内容导出到全局名称空间中。使用这种方法的主要原因是方便。