C++进阶——关于namespace

原创 2016年05月30日 22:38:28

  namespace一般理解为命名空间或者名字空间,在C++程序中,一个作用域里同一个变量只允许有一个定义,但是随着程序规模的扩大,变量越来越多,尤其在不同程序员的代码组合或者相互调用时很容易出现非局部变量的命名冲突,导致变量重定义错误。
  引入命名空间namespace,将全局作用域进行逻辑上的细化,将变量、函数等聚集到一个名字空间这样一个逻辑作用域下,很好地解决了命名冲突的问题。  
声明命名空间的语法如下:

namespace identifier
{
  named_entities
}

其中identifier是任何有效的标识符,named_entities是一组包含在命名空间中的变量,类型和函数。 例如:

namespace myNamespace
{
  int a, b;
}

在这个例子中,a和b是声明在命名空间myNameSpace下的两个变量。
命名空间内的变量在内部可直接访问,但在命名空间外部访问时则需要使用到操作符::,如上述例子中变量a、b在外部的访问方式为:

myNamespace::a
myNamespace::b

命名空间可以很好的解决命名冲突的问题,例如下面这段代码:

// namespaces
#include <iostream>
using namespace std;

namespace foo
{
  int value() { return 5; }
}

namespace bar
{
  const double pi = 3.1416;
  double value() { return 2*pi; }
}

int main () {
  cout << foo::value() << '\n';
  cout << bar::value() << '\n';
  cout << bar::pi << '\n';
  return 0;
}

运行结果为:
5
6.2832
3.1416
代码中声明了两个命名空间foo和bar,其中在另个命名空间下都定义了一个同名的函数value(),但是由于在不同的命名空间下,并没有发生冲突,通过foo::value() 和 bar::value()调用返回各自的结果,同时通过bar::pi在命名空间外部访问了内部变量的值。

命名空间是可以拆分的,这使得项目中可以在不同的文件或代码段中对同一个namespace的内容进行添加,如下面这段代码:

namespace foo { 
    int a; 
    int c;
}

namespace bar { int b; }

也可以写成:

namespace foo { int a; }
namespace bar { int b; }
namespace foo { int c; }

  在上面的示例代码中以及我们平时写C++代码时都用到了这样一句代码:

using namespace std;

std是一个标准库名字空间,它包含了C++所有的基本变量,类型,常量和功能等,但是我们平时写C++代码时并有用std::cin等类似的来写,这是因为我们通过using关键字将std引入到了当前作用域,这样我们在写代码时可以直接访问而不再需要通过操作符::,如果我们平时写代码是没有加入using namespace std,则也需要使用std::cin,std::cout这样的格式,否则会提示错误cin、cout未定义,相信很多人初学C++的时候就遇到过。
下面这段代码比较全面的展示了using namespace的效果:

// using
#include <iostream>
using namespace std;

namespace first
{
  int x = 5;
  int y = 10;
}

namespace second
{
  double x = 3.1416;
  double y = 2.7183;
}

int main () {
  using first::x;
  using second::y;
  cout << x << '\n';
  cout << y << '\n';
  cout << first::y << '\n';
  cout << second::x << '\n';
  return 0;
}

运行结果是:
5
2.7183
10
3.1416
具体分析不再赘述。
虽然通过using关键字的引入,可以简化代码中::操作访问,但是这样当引入多个名字空间时,就可能出现不同名字空间内命名冲突的问题,所以,实际编码过程中要谨慎使用using关键字引入不同的命名空间。

更多内容及本文参考:
http://www.cplusplus.com/doc/tutorial/namespaces/

版权声明:本文为博主原创文章,转载请注明出处。

C++中namespace的使用

命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个任务中的所有类声明放在同一个命名空间中。标准C++库(不包括标准C库)中所包含的所有内容(包括常量、变量、结构...
  • kevinx_xu
  • kevinx_xu
  • 2014年03月04日 09:22
  • 1131

C++中namespace的用法

C++中采用的是单一的全局变量命名空间。在这单一的空间中,如果有两个变量或函数的名字完全相同,就会出现冲突。当然,你也可以使用不同的名字,但有时我们并不知道另一个变量也使用完全相同的名字;有时为了程序...
  • hongkangwl
  • hongkangwl
  • 2013年12月28日 21:57
  • 1389

C++命名空间 namespace的作用和使用解析

转自:http://blog.sina.com.cn/s/blog_af68a2c201015pqo.html一、 为什么需要命名空间(问题提出)命名空间是ANSIC++引入的可以由用户命名的作用域,...
  • jimeshui
  • jimeshui
  • 2016年05月22日 12:02
  • 9981

【C++进阶】深入理解C/C++(4)

【C++进阶】深入理解C/C++(4) 总结一下第三讲,我们可以知道,相对于第一位候选者,第二位候选者在以下几个方面有更深的认识: 1、  C与C++的联系; 2、 ...
  • fu_zk
  • fu_zk
  • 2014年02月19日 15:23
  • 1268

C++中namespace跨多个文件的问题

在C++14标准中(我使用的是最接近的working draft, N3797),在"7.3 Namespaces"中,关于namespace有一句话,“Unlike other declarativ...
  • oneinmore
  • oneinmore
  • 2015年04月08日 16:35
  • 1953

C++中的命令空间NameSpace定义和使用

1.NameSpace        在C++中,名称(name)可以是符号常量、变量、宏、函数、结构、枚举、类和对象等等。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标...
  • wangjianno2
  • wangjianno2
  • 2015年11月08日 23:27
  • 877

C++学习之namespace的用法

fish.cpp&fish.h #ifndef __test_header__fish__ #define __test_header__fish__ #include namespace ns_...
  • softmanfly
  • softmanfly
  • 2015年04月02日 10:38
  • 2638

C++高级进阶 第一季:const 详解

零、文章来由打算将基础知识在看书的同时系统的整理一下,方便大家也方便自己。整理的知识尽量参照书本知识,比网上获取的资料有更高的可信度。一、从 文字常量和常变量 开始补充:const并没有想象中的那么简...
  • Scythe666
  • Scythe666
  • 2016年03月05日 10:11
  • 1459

C++命名空间namespace的理解和用法

命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同一个任务中的所有类声明放在同一个命名空间中。标准C++库(不包括标准C库)中所包含的所有内容(包括常量、变量、结构...
  • lishuandao
  • lishuandao
  • 2016年03月13日 15:01
  • 626

C++进阶必读书籍

结合一些我的学习经历,希望对于想学C++的人有些帮助. 大家有什么好想法望提出 我老师最初是从C语言教起的,用的是潭浩强的>这本书,那时候命令执行都是在CMD里实现,用的编译器是turboc最经常用...
  • chenqiai0
  • chenqiai0
  • 2014年01月25日 10:03
  • 7443
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++进阶——关于namespace
举报原因:
原因补充:

(最多只允许输入30个字)