using namespace std;的注意事项

作者:zhang.jingjing
链接:转自  https://www.zhihu.com/question/26911239/answer/51503880
来源:知乎

因为使用STL中 有部分名称是没有加下划线的保留标记的
而在自己的源代码中用到了后会引发未定义的后果

例如:

#include <algorithm>
using namespace std;
int main()
{
	int max=0;
}

一直我都告诫学习C++的人 以后精通了C++就不要用using namespace std;
如使用 如using std::cin;效果会更好

原例子已删除:未经证实
例子原文放在最后

----update:Jun 18th , 2015

看来论据不够充分 那我加下

《C++ Primer Plus (第六版 中文版 人民邮电出版社)》第九章:内存模型和名称空间 第328页:
"有关using编译命令和using声明,需要记住的一点是,他们增加了名称冲突的可能性。"

《C++ Primer Plus (第六版 中文版 人民邮电出版社)》第九章:内存模型和名称空间 第329页:

一般说来,使用using命令使用using编译命令安全,这是由于它只导入了制定的名称。如果该名称与局部名称发生冲突,编译器将发出指示。using编译命令导入所有的名称,包括可能并不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器并不会发出警告。另外,名称空间的开放性意味着名称空间的名称可能分散在多个地方,这使得难以准确知道添加了哪些名称。
...
然而名称空间的支持者希望有更多的选择,既可以使用解析运算符面也可以使用using声明,也就是说,不要这样做:

using namespace std; // avoid as too indiscriminate(随意)

而应这样做

int x;
std::cin >> x ;
std::cout << x << std::endl;

或者这样做

using std::cin;
using std::cout;
using std::endl;
int x;
cin >> x;
cout << x << endl;

《C++ Primer Plus (第六版 中文版 人民邮电出版社)》附录I: 转换为ISO标准的C++ 第915页:

名称空间有助于组织程序中使用标识符,避免名称冲突。由于标准库是使用性的头文件组织实现的,它将名称放在std名称空间中,因此使用这些头文件需要处理名称空间。
出于简化的目的,本书的事例通常使用编译命令using来使std名称空间中名称可用:

#include <iostream>
#include <string>
#include <vector>
using namespace std;    //a using-directive

然而,不管需要于否,都导出名称空间中的所有名称,是于名称空间的初衷背道而驰的

由此可见 using namespace std; 并不是可以随意使用的语句。

----update:Jun 18th , 2015 night.

觉得例子还不够丰富 就上了google看看
在Steve Donovan 《C++ by Example》中写到:

However, some people feel strongly that using namespace std cases namespace pollution because everything is dumped into the global namespace, which is what namespaces were designed to prevent. You need to understand the implications of using namespace std, and you need to recognize that there is one case where it always a bad idea.

而在国外的论坛StackOverflow
对于What requires me to declare “using namespace std;”?
Péter T?r?k给出了这样的解释

However,

using namespace std;

is considered a bad practice because you are practically importing the whole standard namespace, thus opening up a lot of possibilities for name clashes. It is better to import only the stuff you are actually using in your code, like

using std::string;

--update: Jan. 14th, 2016 morning
原文已被删除

--update May 20th, 2016 evening
删除原文:Ubuntu Pastebin

时间: 2024-10-19 00:26:49

using namespace std;的注意事项的相关文章

【转】关于“using namespace std”

对于一个存在着标准输入输出的C++控制台程序,一般会在#include <iostream>的下一行发现一句话,using namespace std.这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义.其作用就在于避免发生重命名的问题. 1. 关于namespace C++引入了命名空间namespace主要解决了多个程序员在编写同一个项目中可能出现的函数等重名的现象.解决方法就是加上自己的命名空间.比如下面的例子: 1 2 3 4 5 6 7 8 9 10 11 12 1

C++ using namespace std(转载)

转载自http://www.kuqin.com/language/20080107/3532.html 感谢这位大神的解答! 以下的内容摘抄自转载的文章里面的部分内容. 早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h. 因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现:当使用<iostream>的时候,该头文件没有定义全局命名空

using namespace std

using namespace std std 是一个命名空间..不同的命名空间可以有相同的类名被定义 ..using namespace std;就是指明下面的程序使用std,如果不用这句指明的话就要用std::string(string是std空间中定义的也可以在全局空间中定义,只要名字空间不一样即可..)..否则可以默认名字空间中有std.便不用std::来修饰它是C++新标准中有的,解决多人作编大程序时名字冲突问题.比如A B两个班都有叫张三的人,你要使用A班的张三,必然要先指名是A班这

(转)c++ 中的using namespace std是什么意思,什么时候用

使用std命名空间 98年以后的c++语言提供一个全局的命名空间namespace,可以避免导致全局命名冲突问题.举一个实例,请注意以下两个头文件: // one.hchar func(char);class String { ... }; // somelib.hclass String { ... }; 如果按照上述方式定义,那么这两个头文件不可能包含在同一个程序中,因为String类会发生冲突.所谓命名空间,是一种将程序库名称封装起来的方法,它就像在各个程序库中立起一道道围墙.比如://

Error:全局变量不明确(using namespace std 与全局变量的冲突)

在用递归写八皇后时,定义了一个全局变量count,结果出现问题如下:提示全局变量不明确. 最后发现在实现文件.cpp中,我使用了using  namespace std; 解决方法: 1.使用count 的地方改成 ::count 替代(因为std命名空间下也有 std::count ,编译器不确定此处是::count 还是std::count,所以会不明确) 2.注释掉这个命名空间 3.或者改用 : using std::cout; using std::endl; using std::ci

关于using namespace std

[来自]http://www.cnblogs.com/uniqueliu/archive/2011/07/10/2102238.html 对于一个存在着标准输入输出的C++控制台程序,一般会在#include <iostream>的下一行发现一句话,using namespace std; 这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义.其作用就在于避免发生重命名的问题. 1. 关于namespace C++引入了命名空间namespace主要解决了多个程序员在编写同一个

C++“using namespace std;”的理解

如果程序中需要使用C++的输入(cin)或输出(cout)工具,必须提供这样两行代码: 1 #include <iostream> 2 using namespace std; //可以使用空间名称为std里面的东西 当我建立一个名为HelloWord 的C++工程时会出现这样的代码: 1 using namespace HelloWord; //可以使用空间名称为HelloWord里面的东西 C++引入名称空间namespace的目的是避免多个程序员在编写同一个项目时出现函数或变量重名的现象

(C++)浅谈using namespace std

1.<iostream>和<iostream.h> 在你的编译器include文件夹里面可以看到,二者是两个文件,里面的代码是不一样的. 后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里: c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h. 因此, 当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现: 当使用<iostr

std::和using namespace std;

std是标准命名空间名称 相同点: std::和using namespace std:的意思是一样的,都表示使用命名空间std: 不同点: 放在程序中的位置不同 1. using  namespace  std:头文件如果包含了#include<iostream>,那么在头文件下方写上using  namespace  std:2.std::头文件如果包含了#include<iostream>,但是没有在头文件下方写上using  namespace  std:那么在使用标准输入