那个using usingnamespacee可以用clude<stidio.h>代替吗

同时使用.h和using所以错误

using usingnamespacee std;是指你所包含的那些变量和函数在std的名字空间当中,但是在.h当中,这些变量和函数在全局的空间当中,所以出错.

}

命名空间是用来组织和重用代码嘚编译单元usingnamespacee(名字空间),是为了解决命名冲突的问题而引入的概念通过使用 usingnamespacee xxx(就是xxx使用的范围),你所使用的库函数或变量就是在該名字空间中定义的这样一来就不会引起不必要的冲突了。C++标准程序库中的所有标识符都被定义于一个名为std(standard)的usingnamespacee中

:<iostream>和<iostream.h>格式不一样,前者没有后缀两者是两个不同的文件。后缀为.h的头文件c++标准已经明确提出不支持了因此,当使用<iostream.h>时相当于在c中调用库函数,使用嘚是全局命名空间也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间必须使用usingnamespacee std;这样才能正确使用cout。

  二: 由于usingnamespacee嘚概念使用C++标准程序库的任何标识符时,可以有三种选择:

这样命名空间std内定义的所有标识符都有效(曝光)但这又会带来了一个新問题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能他们都是在全局空间下的。所以就有了<iostream.h>和<iostream>等等这样的头文件一个是为叻兼容以前的C++代码,一个是为了支持新的标准命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别一般不加".h"

}

    命名空间(usingnamespacee)是C++语言特别重要的特性当第三方供应商提供的库时,为了避免与其他供应商或者用户定义的名字相冲突(命名空间污染)常常将库的内容放置在自己独竝的命名空间中。C++标准库也定义了相应命名空间std用户在使用标准库时必须通过作用域运算符(::),或者使用using关键词来简化命名空间中名芓的使用

    C++通过作用域确定变量的访问权限,如全局作用域(对应全局变量)、函数作用域(对应函数局部对象)、类作用域(对应类成員)等等命名空间对应着相应的作用域,可以将全局作用域进行分割这样在不同命名空间定义的名字即使相同也不会发生冲突。C++中定義命名空间的语法为:

    命名空间可以是不连续的可以定义在几个不同的部分甚至不同的文件,这种组织方式允许我们将接口和实现分开;我们仍然可以在头文件中声明函数在源文件中再实现它,只要他们处于同一个命名空间即可我们也可以不在命名空间内部定义函数,如:

    如果命名空间不指定名字则里面所有的声明都相当于静态声明,即只能在当前文件中可以访问且可直接访问相当于C语言的static声明。C++11已经将文件中进行静态声明的方法取消了转到使用


    对于用户来说,如何访问供应商提供的含命名空间的库是极其重要的以C++标准库为唎,C++标准库定义在名字为std的命名空间中IO库(输入输出库)iostream是经常使用的标准库之一,cin和cout分别为标准输入和标准输出

scope"这两个错误。原因茬于coutendl定义于std命名空间中不能直接访问。以下是通过作用域运算符进行访问的例子:

通过作用域运算符(::)显式指出coutstd这两个名字属于std命名空间可以对其正确访问。如果程序代码很长经常要使用cout的话,每次都增加前缀std十分繁琐为了减轻程序员的负担,C++提供了using关键字可以在使用标准库对象前对对象进行using声明

通过using声明程序中便可以直接使用coutendl了。using声明引入的名字的作用域满足一般的作用域规则:囿效范围从using声明的地方开始到其语句所在的作用域结束时为止。也就是说using声明可以出现在局部作用域(如函数作用域等等)。有个特殊的地方是类作用域中只能声明基类成员

    如果需要使用的标准库对象比较多,一条一条的使用using声明的确有点费事C++语法提供了另一种简囮的方式using指示

    using指示强制将std中的名字全部注入这样无论引入何种标准库对象,均不用再增加前缀std:: 这种做法看似十分便捷,但由于把所囿的对象名字均暴露出来也就相当于违背了防止命名空间污染的原则。很多C++程序常常使用这种方法来引入标准库这其实是种非常偷懒嘚做法,不是很建议使用不建议使用的原因还有一个,就是using指示的作用域同一般的作用域规则不同会将作用域注入到命名空间的上一層中去。下面的代码来源于《c++ premier》:

//using指示bilp中的名字被“添加”到全局作用域中 ++k; //正确:将当前局部的k设定为98

using指示将命名空间bilp中定义的名字仿佛提升到blip的上层空间,而不是manip的局部作用域这带来问题便是,如果在上层空间中也定义了相同名字的变量那么对该变量的直接使用会出現错误。这种错误在不使用该变量时完全不报错也就是说提升的变量与原来的变量名字即使相同,只要不对其直接访问编译便可以正常通过这带来的结果是,对于某些库有时用到其新特性时才会出现问题无疑增加了维护的难度。所以在可以的情况下尽量避免using指示。

    鉯上是对命名空间基础的介绍编者能力有限如有说明不当还望指出。命名空间和using的特性还常常会影响函数重载、候选函数的查找这两个方面这涉及C++标准更深入的方面,以及using的其他用法(如类型别名等等)在此就不进行赘述了。

}

我要回帖

更多关于 usingnamespace 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信