命名空间的定义格式为:(取自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. MapReduce编程实现学习

    MapReduce主要包括两个阶段:一个是Map,一个是Reduce. 每一步都有key-value对作为输入和输出. Map阶段的key-value对的格式是由输入的格式决定的,如果是默认的Text ...

  2. ZOJ 4257 MostPowerful(状压DP,简单)

    题目大意:不超过10种气体,两两之间相互碰撞可以产生一定的能量,如a碰b,那么b气体就消失,自身不能碰自身,问最后所能得到的最大能量. 原代码链接:http://blog.csdn.net/accry ...

  3. 转:谷歌大脑科学家 Caffe缔造者 贾扬清 微信讲座完整版

    [转:http://blog.csdn.net/buaalei/article/details/46344675] 大家好!我是贾扬清,目前在Google Brain,今天有幸受雷鸣师兄邀请来和大家聊 ...

  4. linux命令(5)文件操作:ls命令、显示文件总个数

    一:ls命令是最常用的linux命令了:下面是ls --help里面的用法 在提示符下输入ls --help ,屏幕会显示该命令的使用格式及参数信息: 先介绍一下ls命令的主要参数: -a 列出目录下 ...

  5. Spring中bean的配置

    先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很显然的,使用new那么就表示当前模块已经 ...

  6. Input gameobject vector3 c#

    Input类中的常用方法 bool w=Input.GetKey(KeyCode.W);//检测是否按下键盘W Input.GetKeyDown(KeyCode.W);//表示检测按下时 Input. ...

  7. Document root element "configuration", must match DOCTYPE root "mapper".

    最近剛剛鼓搗mybatis , 第一個demo就出了問題.其實原因是因為將mapper中的頭copy到了configuration里去了 <?xml version="1.0" ...

  8. 用友UAP

    1, 用友UAP 用友集团UAP中心成立于2013年1月1日,隶属于用友集团,旨在为全球大中型企业和公共组织提供计算平台,并打造完整.统一的软件产业链生态系统,以先进的平台.技术和专业的服务成为客户信 ...

  9. Java注解处理器--annotation学习四

    Java中的注解(Annotation)是一个很神奇的东西,特别现在有很多Android库都是使用注解的方式来实现的.一直想详细了解一下其中的原理.很有幸阅读到一篇详细解释编写注解处理器的文章.本文的 ...

  10. Opencv 2.4.9在Ubuntu下的配置与安装

    [原]Opencv 2.4.9在Ubuntu下的配置安装  Opencv 2.4.9在Ubuntu下的配置与安装 surgewong@gmail.com http://blog.csdn.net/su ...