没有躲过的坑--使用using namespace std的坏习惯
2015-11-26 21:20
253 查看
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。
在C++中,变量、函数和类都是大量存在的。如果没有命名空间,这些变量、函数、类的名称将都存在于全局命名空间中,会导致很多冲突。比如,如果我们在自己的程序中定义了一个函数toupper(),这将重写标准库中的toupper()函 数,这是因为这两个函数都是位于全局命名空间中的。命名冲突还会发生在一个程序中使用两个或者更多的第三方库的情况中。此时,很有可能,其中一个库中的名 称和另外一个库中的名称是相同的,这样就冲突了。这种情况会经常发生在类的名称上。比如,我们在自己的程序中定义了一个Stack类,而我们程序中使用的某个库中也可能定义了一个同名的类,此时名称就冲突了。
Namespace 关键字的出现就是针对这种问题的。由于这种机制对于声明于其中的名称都进行了本地化,就使得相同的名称可以在不同的上下文中使用,而不会引起名称的冲突。或许命名空间最大的受益者就是C++中的标准库了。在命名空间出现之前,整个C++库都是定义在全局命名空间中的(这当然也是唯一的命名空间)。引入命名空间后,C++库就被定义到自己的名称空间中了,称之为std。这样就减少了名称冲突的可能性。我们也可以在自己的程序中创建自己的命名空间,这样可以对我们认为可能导致冲突的名称进行本地化。这点在我们创建类或者是函数库的时候是特别重要的。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
namespace是指标识符的各种可见范围。命名空间用关键字namespace 来定义。命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。 由于namespace的概念,使用C++标准程序库的任何标识符时,
可以有三种选择:
[1] 直接指定标识符
例如std::iostream而不是iostream。完整语句如下:
[2]使用using关键字
[3]使用using namespace std
但是坑儿就再这里,从我们学习C++开始,很愿意写using namespace std,这样在实际工程中也许就会有所灾难。
看看下面的代码:
一切都有序进行,你可以从Foo中调用Blah,可以从Quux调用Bar。
但是有一天,你升级了Foo,在Foo中也声明了一个Quux函数,这样问题就来了。
也许是别人给你挖的坑儿,也许是你挖了坑在等别人。
所以千万不要使用using namespace std这样的语句在实际工程中,不能嫌麻烦,在调用的函数的时候,在前面冠以命名空间。
也许有的人对此感到不屑,但是对于一个优秀的程序员好习惯一定是必要的!!!
在C++中,变量、函数和类都是大量存在的。如果没有命名空间,这些变量、函数、类的名称将都存在于全局命名空间中,会导致很多冲突。比如,如果我们在自己的程序中定义了一个函数toupper(),这将重写标准库中的toupper()函 数,这是因为这两个函数都是位于全局命名空间中的。命名冲突还会发生在一个程序中使用两个或者更多的第三方库的情况中。此时,很有可能,其中一个库中的名 称和另外一个库中的名称是相同的,这样就冲突了。这种情况会经常发生在类的名称上。比如,我们在自己的程序中定义了一个Stack类,而我们程序中使用的某个库中也可能定义了一个同名的类,此时名称就冲突了。
Namespace 关键字的出现就是针对这种问题的。由于这种机制对于声明于其中的名称都进行了本地化,就使得相同的名称可以在不同的上下文中使用,而不会引起名称的冲突。或许命名空间最大的受益者就是C++中的标准库了。在命名空间出现之前,整个C++库都是定义在全局命名空间中的(这当然也是唯一的命名空间)。引入命名空间后,C++库就被定义到自己的名称空间中了,称之为std。这样就减少了名称冲突的可能性。我们也可以在自己的程序中创建自己的命名空间,这样可以对我们认为可能导致冲突的名称进行本地化。这点在我们创建类或者是函数库的时候是特别重要的。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
namespace是指标识符的各种可见范围。命名空间用关键字namespace 来定义。命名空间是C++的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。 由于namespace的概念,使用C++标准程序库的任何标识符时,
可以有三种选择:
[1] 直接指定标识符
例如std::iostream而不是iostream。完整语句如下:
std::cout<<std::hex<<3.4<<std::endl;
[2]使用using关键字
using std::cout; using std::endl; using std::cin; cout << hex << 3.4 << endl;
[3]使用using namespace std
#include<iostream> #include<sstream> #include<string> using namespace std;
但是坑儿就再这里,从我们学习C++开始,很愿意写using namespace std,这样在实际工程中也许就会有所灾难。
看看下面的代码:
using namespace foo; using namespace bar;
一切都有序进行,你可以从Foo中调用Blah,可以从Quux调用Bar。
但是有一天,你升级了Foo,在Foo中也声明了一个Quux函数,这样问题就来了。
也许是别人给你挖的坑儿,也许是你挖了坑在等别人。
所以千万不要使用using namespace std这样的语句在实际工程中,不能嫌麻烦,在调用的函数的时候,在前面冠以命名空间。
也许有的人对此感到不屑,但是对于一个优秀的程序员好习惯一定是必要的!!!
相关文章推荐
- 移动终端访问互联网时socket的传输过程详解
- Linux内核笔记--内存管理之用户态进程内存分配
- MVC授权认证
- HTTP标头“Vary:Accept-Encoding”指定方法及其重要性分析
- Eclipse安装WindowBuilder
- SQL server 2008无法连接Local服务器的解决办法
- 【codevs1012】最大公约数和最小公倍数
- lan备份,lan-free,server-free,NDMP备份
- Java访问修饰符
- Storm开发过程中的问题与建议
- 杭电oj 1006
- 《重构——改善既有代码的设计》读书笔记(一)
- jstl标签库
- BZOJ3681: Arietta
- centos7安装vncserver
- Git Summary
- java编译,运行
- 杭电1595 find the longest of the shortest
- 字符编码详解
- 顺序栈,C++基本实例应用