名称空间
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了名称空间相关的知识,希望对你有一定的参考价值。
名称空间
名称空间的种类:
1. 由用户定义的有名字的名称空间,作用是提供一个声明名称的区域。
在名称空间中声明的名称的链接性为外部的。
名称空间是开放的,即可以把名称加入到已有的名称空间中。
2. 全局名称空间,对应于文件级声明区域。全局变量位于全局名称空间中。
3. 未命名的名称空间。无法显式地使用using编译指令或using声明将未命名空间中的名称加入到其它命名空间中。这就提供了链接性为内部的静态变量的替代品。
名称空间的用法:
1. using声明和using编译指令
using声明将特定的标识符加入到它所属的声明区域中。在全局声明区域中
使用using声明时,会把名称添加到全局名称空间中。在代码块中使用using声明时,会把名称添加到局部名称空间中。
using编译指令使整个名称空间可用。在全局声明区域中使用using编译指令,将使该名称空间中的名称在全局空间中可用。在代码块区域中使用using编译指令,将使该名称空间中的名称在代码块区域中可用。
2. using声明和using编译指令的不同之处
假设名称空间和声明区域定义了相同的名称。如果试图使用using声明将名称空间中的名称该声明区域,则这两个名称会发生冲突,从而出错。如果使用using编译指令将该名称空间中的名称导入该声明区域,则局部版本将隐藏名称空间版本。
请看示例代码:
[email protected]:~/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);
}
[email protected]:~/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++写诗” 博客,谢绝转载!
以上是关于名称空间的主要内容,如果未能解决你的问题,请参考以下文章
PHP命名空间的三种引用方式:非限定名称限定名称完全限定名称