命名空间的定义格式为:(取自C++标准文档)

named-namespace-definition:
namespace identifier { namespace-body }
unnamed-namespace-definition:
namespace { namespace-body }
namespace-body:
declaration-seqopt
有名的命名空间:       
namespace 命名空间名 {              
            声明序列可选       
}
 
无名的命名空间:       
namespace {              
            声明序列可选       
}
 
 
所谓C++中的namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
一、<iostream>和<iostream.h>
  <iostream>和<iostream.h>是不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。
  后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了 和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。                            
  因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使 用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。 
二、所谓namespace,是指标识符的各种可见范围。 
  C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。 
  由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择: 
  1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下: std::cout << std::hex << 3.4 << std::endl; 
  2、使用using关键字。 using std::cout; using std::endl; 以上程序可以写成 cout << std::hex << 3.4 << endl; 
  3、最方便的就是使用using namespace std; 
例如:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;
//这样命名空间std内定义的所有标识符都有效。就好像它们被声明为全局变量一样。那么以上语句可以如下写:
cout<< hex << 3.4 <<endl;
  因为标准库非常的庞大,所程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就 把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间 下的。 所以就有了<iostream.h>和<iostream>等等这样的头文件,一个是为了兼容以前的C++代码,一 个是为了支持新的标准。命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h" 。今天用了VISUAL C++写了个小程序(VS2005),很简单很简单的,但是就是编译不通过出现一个奇怪的问题:错误 1 error C2668: “max”: 对重载函数的调用不明确   

最初代码如下:

#include     
using namespace std;   
template   
T max (T a,T b)   
{   
return ((a>b)?a:b);   
}   
void main()   
{   
double x,y;   
cin>>x>>y;   
cout<<"Max number is "<<(max(x,y))<<endl;  
cin>>x;   
}   
    我将这段代码放到VC++ 6.0下竟然通过了,程序运行也正常。这让我百思不得其解。后来终于弄明白了! 其实在std命名空间下还有一个MAX函数,而且实现的功能也是一样的……我昏。利用转到定义功能可以看到微软是怎么写MAX函数的。这里为了不被鄙视就不贴微软的代码了。明白了为什么出现这个错误我们就改写代码如下:
#include     
using std::cin;   
using std::cout;   
using std::endl;   
template   
T max (T a,T b)   
{   
return ((a>b)?a:b);   
}
void main()   
{   
double x,y;   
cin>>x>>y;   
cout<<"Max number is "<<(max(x,y))<<endl;
cin>>x;   
}
  这是我比较推荐的做法,因为C++ PRIMER, EFFECTIVE C++上都是用这种方式的,但是谭浩强的书上都是一句using namespace std;就搞定,我觉得蛮简洁的就一直用了,没想到带来那么多的问题,以前在友元函数上还碰到莫名的错误呢。   
  其实还有两个简单的解决方案,那就是把自己定义的函数改成其他的名字,或者直接用微软提供的函数。相信微软提供的效率绝对不会比我们写的低~好了,就写到这了。希望大家养成良好的编程习惯,^-^
 
  再者,由于大家一直都是直接使用以下微软自带的库文件:
#include "iostream"
using namespace std;

  此处链接为百度百科,对于命名空间的详解:http://baike.baidu.com/link?url=epiFYb_Hsw0nx6sig9eQefXTHPR1W2SuVnFazodsCueqt1g-ZCJXvkz8Pnx8zYSGrXFmSdTPQS1DYBTEMLYsgK

  其实,换句话自己理解,命名空间std比较特殊,因为std是微软已经定义好的标准库,假如你不使用“using namespace std”,则你就不能调用std库中的任何函数。看下面的代码:
namespace test
{
template <class T>
class allocator
{
public:
.........
}
}
  将一个声明的模板放在命名空间为test中,假如你在使用的时候没有使用“using namespace test”而去使用命名空间中声明的模板,这是就会出错,提示“error C3861: “class allocator”: 找不到标识符",其实可以这样理解,命名空间就是把空间内定义的内容装在一个盒子里,而命名空间名就是它的域,你只要调用了”using namespace 命名空间名“,相当于将域引入到了动作范围内,然后使用它就不会有错了。我自己写了一个很简单的测试例子:
//Display.h  使用命名空间声明了一个显示函数
#pragma once
#include "iostream"
using namespace std; namespace test
{
void Display()
{
cout<<"Hello World!!!"<<endl;
}
} //Test.cpp 主函数调用命名空间内声明的函数
#include "stdafx.h"
#include "Display.h"
using namespace test;//将此命名空间调用,将在下面可以直接使用命名空间中声明的显示函数
//假如将此句话屏蔽,编译提示错误"error C3861: “Display”: 找不到标识符"
int _tmain(int argc, _TCHAR* argv[])
{
Display();
return ;
}
 

C++ Namespace 详解的更多相关文章

  1. Linux ns 4. UTS Namespace 详解

    目录 1. 使用简介 1.1 hostname 1.2 domainname 1.3 uname 2. 代码分析 2.1 copy_utsname() 2.2 sethostname() 2.3 ge ...

  2. Linux ns 6. Network Namespace 详解

    文章目录 1. 简介 1.1 Docker Network 桥接模式配置 2. 代码解析 2.1 copy_net_ns() 2.2 pernet_list 2.2.1 loopback_net_op ...

  3. Docker 基础技术之 Linux namespace 详解

    Docker 是"新瓶装旧酒"的产物,依赖于 Linux 内核技术 chroot .namespace 和 cgroup.本篇先来看 namespace 技术. Docker 和虚 ...

  4. C++中的namespace详解

    原文链接:http://blog.csdn.net/yao_zhuang/article/details/1853625 namespace中文意思是命名空间或者叫名字空间,传统的C++只有一个全局的 ...

  5. Linux ns 5. IPC Namespace 详解

    文章目录 1. 简介 2. 源码分析 2.1 copy_ipcs() 2.2 ipcget() 2.3 ipc_check_perms() 2.4 相关系统调用 参考文档: 1. 简介 进程间通讯的机 ...

  6. Linux ns 3. Mnt Namespace 详解

    1. 文件系统层次化 对 Linux 系统来说一切皆文件,Linux 使用树形的层次化结构来管理所有的文件对象. 完整的Linux文件系统,是由多种设备.多种文件系统组成的一个混合的树形结构.我们首先 ...

  7. django url 中的namespace详解

    [引子] django是一个比较全能的web框架,比如它实现了自己的orm模型来对接不同的数据库.并提供了方便的数据接口:django牛逼的地方 还有许多,如他实现了自己的模板语言,这样我们就能方便的 ...

  8. Docker 基础技术之 Linux cgroups 详解

    PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 推荐大家到公众号阅读,那里阅读体验更好,也沉淀了很多篇干货. 前面两篇 ...

  9. PHP中的命名空间(namespace)及其使用详解

    PHP中的命名空间(namespace)及其使用详解 晶晶 2年前 (2014-01-02) 8495次浏览 PHP php自5.3.0开始,引入了一个namespace关键字以及__NAMESPAC ...

随机推荐

  1. 黄聪:如何删除wordpress登录之后wp_footer、wp_head自行加载的Open Sans字体、fonts.googleapis.com连接导致卡死的问题

    有时候在浏览自己的WordPress网站时,发现网页长时间无响应, 卡在正在连接到fonts.googleapis.com ,如下图所示: 查看网页源码时,发现Head里面有如下一段代码: <l ...

  2. Orcale(一)概念

    一 . 基本概念 :   1. orcaleinstanceclient : orcale的客户端  ( 1. 中文乱码问题 : NLS_LANG=SIMPLIFIED CHINESE_CHINA.Z ...

  3. 执行sh文件 进行MongoDB的业务逻辑导入

    将从HDFS中的数据转化为Json格式写入文件后,十个文件的文件名为 文件名_01 ...._02 ....03格式. 编写个简单的sh文件 通过for do循环让i+1 文件名对应上就可以的- -执 ...

  4. NeHe OpenGL教程 第九课:移动图像

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. mysql server has gone away 与max_allowed_packed

    今天在本地测试测试给所有店铺批量发信息的功能,大约2万条记录,在本地和备用linux服务器上测试都没有问题,但上windows时一直报mysql server has gone away的错误,搜索一 ...

  6. eclipse中输入@符号自动提示Annotation

    将Eclipse中Content Assist中的Auto activation for java里.的后面加上@符号即可

  7. JAVA 数组排序

    一.数组升序排序 实例: import java.util.Arrays; //导入数组处理 public class Test{ public static void main(String[] a ...

  8. H2 database的使用

    H2最完整的资料下载地址: http://download.csdn.net/detail/yixiaoping/5956595       H2数据库使用   H2数据库介绍 常用的开源数据库:H2 ...

  9. Python标准库03 路径与文件 (os.path包, glob包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 路径与文件的简介请参看Linux文件系统 os.path包 os.path包主要是 ...

  10. 里德九步审讯法 z

    在现实生活中,警方审讯靠的不仅仅是自信和创造力(尽管这两点对审讯工作确有帮助)——审讯者还要在交际影响的心理战术方面接受过高水平训练.       让一个人认罪可不是件容易事,而警察有时能让无辜者承认 ...