首页 > 代码库 > 名称空间

名称空间

名称空间


名称空间的种类:
1. 由用户定义的有名字的名称空间,作用是提供一个声明名称的区域。
在名称空间中声明的名称的链接性为外部的。
名称空间是开放的,即可以把名称加入到已有的名称空间中。
2. 全局名称空间,对应于文件级声明区域。全局变量位于全局名称空间中。
3. 未命名的名称空间。无法显式地使用using编译指令或using声明将未命名空间中的名称加入到其它命名空间中。这就提供了链接性为内部的静态变量的替代品。


名称空间的用法:
1. using声明和using编译指令
using声明将特定的标识符加入到它所属的声明区域中。在全局声明区域中
使用using声明时,会把名称添加到全局名称空间中。在代码块中使用using声明时,会把名称添加到局部名称空间中。
using编译指令使整个名称空间可用。在全局声明区域中使用using编译指令,将使该名称空间中的名称在全局空间中可用。在代码块区域中使用using编译指令,将使该名称空间中的名称在代码块区域中可用。
2. using声明和using编译指令的不同之处
假设名称空间和声明区域定义了相同的名称。如果试图使用using声明将名称空间中的名称该声明区域,则这两个名称会发生冲突,从而出错。如果使用using编译指令将该名称空间中的名称导入该声明区域,则局部版本将隐藏名称空间版本。
请看示例代码:
frank@userver:~/project/test/namespace$ cat namespace-1.cpp
#include<cstdio>

namespace Jill{
  char fetch = ‘a‘;
}
char fetch = ‘b‘;

int main(){
  using namespace Jill;
  char fetch = ‘c‘; // hides Jill::fetch

  printf("fetch:(%p, %c)\n", &fetch, fetch);
  printf("Jill::fetch:(%p, %c)\n", &Jill::fetch, Jill::fetch);
  printf("::fetch:(%p, %c)\n", &::fetch, ::fetch);
}


frank@userver:~/project/test/namespace$ cat namespace-2.cpp
#include<cstdio>

namespace Jill{
  char fetch = ‘a‘;
}
char fetch = ‘b‘;

int main(){
  using Jill::fetch; // error: redeclaration of char fetch.
  char fetch = ‘c‘;

  printf("fetch:(%p, %c)\n", &fetch, fetch);
  printf("Jill::fetch:(%p, %c)\n", &Jill::fetch, Jill::fetch);
  printf("::fetch:(%p, %c)\n", &::fetch, ::fetch);
}

再解释一下如下几行常见的代码
#include<iostream>
using namespace std;
#include语句将头文件iostream加入到名称空间std中。然后,using编译指令将名称空间std中的所有内容导出到全局名称空间中。
如果系统不支持名称空间,可以将这两行代码替换为:
#include<iostream.h>
旧的头文件iostream.h没有使用名称空间,但新的头文件iostream使用了名称空间。

3. 名称空间的其它特性
可以嵌套;
可以在名称空间中使用using编译指令和using声明;
using编译指令是可以传递的。

本文出自 “用C++写诗” 博客,谢绝转载!

名称空间