C++|C++ 名称空间详情
目录
- 一、传统的C++命名空间
- 二、新的命名空间特性
- 1.using声明和using编译指令
- 2.名称空间的其他特性
一、传统的C++命名空间 声明区域(
declaration region
): 声明区域是可以在其中进行声明的区域。例如,可以在函数外面声明全局变量,对于这种变量,那么它的声明区域为其声明所在的文件。对于在函数中声明的变量,声明区域为其声明所在的代码块。潜在作用域(
potential scope
): 变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,这是由于变量在定义之后才能使用。二、新的命名空间特性 C++包含了一种功能,即通过定义一种新的声明区域来创建命名的名称空间,这样做的目的之一是提供一个声明名称的区域。一个名称空间中的名称不会与另外一个名称空间的相同名称发生冲突,同时允许程序其他部分使用该名称空间中声明的东西。 例如,使用关键字
namespace
创建两个名称空间:namespace Jack {double pail; // variable declarationvoid fetch(); // function prototypeint pal; // variable declarationstruct Well {...}// structure declaration}namespace Jill {double bucket(double n) {...}; // variable declarationdouble fetch; // variable declarationint pal; // variable declarationstruct Hill {...}// structure declaration}
名称空间是开放的(
open
),即可以把名称加到已有的名称空间中。例如,下面这条语句将名称goose
添加到Jill中已有的名称列表中:namespace Jill {char* goose(const char*); }
同样,原来的
Jack
名称空间为fech()
函数提供了原型。可以在该文件后面(或者另一个文件中)再次使用Jack名称空间来提供函数的代码:namespace Jack {void fetch() {...}}
需要访问给定名称空间的名称时,通过作用域解析运算符::,使用名称空间来限定该名称。
1.using声明和using编译指令
当我们不希望每次使用名称时都对它进行限定,因此c++提供了两种机制(
using
声明和using
编译指令)来简化对名称空间中名称的使用。using声明:使特定声明的标识符可用
namespace Jill {double bucket(double n) { ... }double fetch; }char fetch; int main() {using Jill::fetch// using declarationdouble fetch; // Error! Already have a local fetchcin >> fetch; // read a value into Jill::fetchcin >> ::fetch; // read a value into global fetch}
这段代码,
using
声明将特定的名称添加到它所属的声明区域中。main()
中的using声明将fetch
添加到main()
定义的声明区域中。完成声明后,便可以使用名称fetch
代替Jill::fetch
。using编译指令:使整个名称空间可用
using
编译指令使所有的名称都可用。在全局声明区域中使用using
编译指令,将使该名称空间的名称全局可用。例如:#includeusing namespace std; // 在函数中使用using编译指令,将使其中的名称在函数中可用int main() {using namespace jack; // make names available in vorn()}
不同的命名空间表示不同的内存单元,以下情况会存在二义性问题,使用时应该注意。
using namespace jackusing namespace jill// 二者空间中都有pal变量pal = 4; // which one? now have a conflict
一般来说,使用
using
声明比使用using
编译指令更安全,这是由于它只导入指定的名称。如果该名称与局部名称发生冲突,编译器会发出指示。using编译指令导入所有名称,包括一些实际并不需要的。如果与局部名称发生冲突,局部覆盖名称空间的版本,而编译器不会发出警告。2.名称空间的其他特性
名称空间可以嵌套
namespace elements {namespace fire {int flame; ...}float water; }
访问flame指的是
elements::fire::flame
,同样也可以使用using编译指令使内部的名称可用:using elements::fire
在名称空间中使用using编译指令和using声明,如下:
namespace myth {using Jill::fetch; using namespace elements; using std::count; }
如果要访问Jill::fetch,以下两种方式均可访问它。
myth::fetchJill::fetch
名称空间的传递性
using编译指令是可以传递的。如果A op B且B op C,则A op C。
using namespace myth; /// 以上和下面两句等价using namespace myth; using namespace elements; // 给命名空间创建别名namespace MEF = myth::elements::fire; using MEF::flame;
未命名的名称空间
往往是静态变量的替代品。
static int counts//全局声明 static storage, internal linkage/// 等价于namespace {int counts//static storage, internal linkage}
【C++|C++ 名称空间详情】到此这篇关于C++ 名称空间详情的文章就介绍到这了,更多相关C++ 名称空间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- 【雅静的幸福空间】第60篇《创造快乐》
- 悬疑小故事――空间
- c++基础概念笔记
- 得过且过,请让我过
- 如何解决win10|如何解决win10 C盘空间不足的问题
- 20171110-过敏性疾病的防治
- 08_JVM学习笔记_类命名空间解析
- 达梦数据库|DM8表空间备份恢复