std空间和全局命名空间

目录



注意不要盲目相信以下内容! 不要盲目相信以下内容! 不要盲目相信以下内容! (重要的事情说三遍),虽然以下内容也经过了我的验证,但是我的验证可能有错误的地方,欢迎大家留言告知。希望这篇文章成为你深入探索相关领域的引子启发,而不是标准答案


在C++中,我们常用的头文件为不带“.h”后缀的头文件,而这些头文件里所包含和定义的标识符在std空间中,所以我们使用C++时经常需要加上

using namespace std

而原C语言的头文件为带“.h”后缀的头文件,这些头文件里所包含和定义的标识符在全局命名空间中,不需要声明使用std空间。

命名空间

命名空间是一种特殊的作用域,它包含了处于该作用域中的所有标示符,而且其本身也是由标示符表示的。

拿一个简单的例子来类比,当我们在C++中声明了一个类A之后,我们在类外定义类A的成员函数,这时我们需要在返回值后函数名之前加上

A::

来说明该函数为类A的成员函数。

命名空间也一样是用来说明标识符的所属范围,命名空间的使用目的是为了将逻辑相关的标示符限定在一起,组成相应的命名空间,可使整个系统更加模块化,最重要的是它可以防止命名冲突。

就好比在两个函数或类中定义相同名字的对象一样,利用作用域标示符限定该对象是哪个类里定义的。

C++中的命名空间

C++语言是从C语言发展起来的,因此有很多借鉴的地方。当C++语言推出但尚未标准化以前(98年才标准化),市场上已经有了很多版本的程序库了,各库林立,导致互相应用时出现了一个很难调和的难题,那就是命名冲突,又称名空间泛滥。

比如某个库写了个函数line(int x,int y);不巧另外一个库又写了个类class line;这下编译器该匹配哪个呢?只好取决于哪个库文件先被引用到文件中,并且把另外一个完全屏蔽掉。这显然不是一个好的方法。

在标准库的产生过程中,这个问题被提了出来。为此,标准库组织决定在标准库中引入名空间的概念,所有标准库的组件都在名空间std中定义,由用户手动引入到程序中,这样就让编译器知道,当遇到一个可能冲突的名称时,以标准库中定义的名称为主,如果想用标准库外定义的名称,那程序员需要自己注明另外的名空间,从而达到消除名空间泛滥的目的。

using namespace std

的写法引入了名空间的所有内容,这是一种简单但不保险的做法,是标准库组织不推荐这么做的。因为这样引入了所有的组件函数名,相当于重新引发了名字空间泛滥的问题。为此,好的做法应该是第二种分别引入。


参考资料


C++std命名空间详解
c++标准库 及 命名空间std

上一篇:关于STL扩展库的思考


下一篇:关于Java中的GUI事件处理