C++ Namespace 详解_c++namespace包括什么-程序员宅基地

技术标签: C++  namespace  

C++ Namespace 详解  

2010-08-27 15:08:05|  分类:默认分类 标签:|字号大中小 订阅

命名空间的定义格式为:(取自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>是不一样,前者没有后缀,实际上,在你的编译器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))< 
  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);
  }
  int main()
  {
  double x,y;
  cin>>x>>y;
  cout<<"Max number is "<<(max(x,y))< 
  cin>>x;
  }

  这是我比较推荐的做法,因为C++ PRIMER, EFFECTIVE C++上都是用这种方式的,但是谭浩强的书上都是一句using namespace std;就搞定,我觉得蛮简洁的就一直用了,没想到带来那么多的问题,以前在友元函数上还碰到莫名的错误呢。

  其实还有两个简单的解决方案,那就是把自己定义的函数改成其他的名字,或者直接用微软提供的函数。相信微软提供的效率绝对不会比我们写的低~好了,就写到这了。希望大家养成良好的编程习惯,^-^


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liufengshao/article/details/8956335

智能推荐

Android音视频开发(一)音视频基础知识_android audiorecord 硬件加速-程序员宅基地

文章浏览阅读3.7k次,点赞6次,收藏28次。前言最近工作方面没有太多事,所以难得有些空闲时间,针对当前音视频app的流行,为了不让自己淘汰,提升自己的专业能力,于是决定学习音视频开发相关知识,然而自己这方面却是一个小白,所以希望通过博客的形式记录下自己一步一步学习的过程,也希望能给这方面的新手一些借鉴。学习计划1.了解音视频的基础知识2.了解SurfaceView,TextureView的实现和使用3.Android平台..._android audiorecord 硬件加速

机器学习入门笔记(五)如何学习“机器学习”_学习机器学习要记笔记吗-程序员宅基地

文章浏览阅读317次。 学习“机器学习”这件事,我走过很长的一段弯路。有一些心得、体会和方法,在此和大家分享。以模型为驱动,了解“机器学习”的本质本课力图引导大家以模型为驱动,进行学习。我选择了几种经典模型(例如:线性回归、逻辑回归、决策树、支持向量机、条件随机场、K 均值等),作为入门的进阶。初次学习模型,不必贪多。但就这些选定的模型,一定要搞清楚其问题域、模型函数、目标函数、训练算法……潜入到数..._学习机器学习要记笔记吗

放弃理想,未必能成就现实-程序员宅基地

文章浏览阅读68次。2019独角兽企业重金招聘Python工程师标准>>> ..._未必能成为现实啊

vue项目中使用iframe引入html内嵌页面_eladmin 引用html页面-程序员宅基地

文章浏览阅读1.6k次。一句<iframe class="iframe" src="http://..." frameborder="0" />即可实例:eladmin中引入嵌入在框架页面中的页面1、新增菜单:组件路径是src/views下的文件路径(官网说的)2、在代码中按照新增组件路径写文件:一个energy文件夹,一个index.vue文件3、index.vue内容<template> <div> <iframe class="iframe" src="ht_eladmin 引用html页面

20190403--------------------------spring-mvc.xml配置回顾-程序员宅基地

文章浏览阅读251次。参考链接:https://www.cnblogs.com/zhangxingBlob/p/6364728.html一、配置文件11.自动扫描<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 --><context:component-scan base-package="com.javen.controller" /&g...

Java中格式化输出_java中什么是格式输出-程序员宅基地

文章浏览阅读2k次。 int printf(const char *format,[argument]);  format 参数输出的格式,定义格式为:  %[flags] [width] [.perc] type  规定数据输出方式,具体如下: 1.type 含义如下: %d 十进制整数 159 %x 十六进制数 9f%o 八进制数 ..._java中什么是格式输出

随便推点

OpenCV error: (-215:Assertion failed) _src.empty() in function ‘cv::cvtColor‘_error: (-215:assertion failed) !_src.empty() in fu-程序员宅基地

文章浏览阅读2.3k次。我解决这个问题的方法是:文件路径是对的,图像的格式是png,而代码中要求的格式是jpg,将png转换为jpg就能解决了。_error: (-215:assertion failed) !_src.empty() in function 'cv::cvtcolor

(week 2)第二周总结_week2是第二周吗-程序员宅基地

文章浏览阅读579次。一、读SMPL模型论文上周跑通了SMPL的示例模型,这周尝试用自己的图片跑SMPL并得到结果,研究获得任意人体三维模型的方法,关于对SMPL论文的初步阅读见简单了解SMPL模型和文后引用二、分析CPM和SMPL代码,利用自己的图片跑CPM得出结果,作为SMPL的输入,得到任意人体三维模型参见https://blog.csdn.net/weixin_36595565/article/de..._week2是第二周吗

GridView 中RowCommand 事件的好方法_gridview1_rowcommand函数-程序员宅基地

文章浏览阅读4.6k次。1.在模板列中放一个Button和TextBox,TextBox用来存放产品名,将Button的CommandName设置为add并且在html中将他的CommandArguments属性和RowIndex进行绑定: '> ' />_gridview1_rowcommand函数

初识MSTP_mstp 桥id表示方法-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏15次。mstp:STP解决了交换机网络环路的问题,但是收敛慢,RSTP解决了STP收敛慢的问题,但是RSTP和STP都没能解决交换机网路存在的链路利用率低的问题。因为存在环路,导致数据转发的时候,有一条路径是不转发数据的,所以链路利用率低。没办法达到负载均衡的目的。RSTP既解决了环路问题和链路利用率低的问题又提高了收敛速度。是现今使用最广的协议。配置过程如下:首先把所有互联的交换机端口都设置成trun..._mstp 桥id表示方法

Join 连表操作_join 能连自己表吗-程序员宅基地

文章浏览阅读192次。参考文章https://time.geekbang.org/column/article/79700https://time.geekbang.org/column/article/80147NLJ(Index Nested-Loop Join)对于被驱动表有索引的情况遍历驱动表,每读出一条驱动表上的数据,都会去被驱动表的索引树上获取满足条件的数据,组成一行作为结果集的一部分。然后重复上述步骤NLJ优化使用MRR的时候,就会先讲驱动表的数据部分存放到join_buffer中,然后一次性传入一批的_join 能连自己表吗

python映射的主要特点_Python编程语言的35个与众不同之处(语言特征和使用技巧)...-程序员宅基地

文章浏览阅读123次。一、Python介绍从我开始学习Python时我就决定维护一个经常使用的“窍门”列表。不论何时当我看到一段让我觉得“酷,这样也行!”的代码时(在一个例子中、在StackOverflow、在开源码软件中,等等),我会尝试它直到理解它,然后把它添加到列表中。这篇文章是清理过列表的一部分。如果你是一个有经验的Python程序员,尽管你可能已经知道一些,但你仍能发现一些你不知道的。如果你是一个正在学习Py..._python映射类型的特点

推荐文章

热门文章

相关标签