为什么大佬都建议写 c++不要写 using namespace std

2023-10-07 17:53:04 +08:00
 okura
刚刚学 c++没多久,看到很多代码还有很多大佬都是说不要写 using namespace std ,为什么呢?求助各位大佬
4090 次点击
所在节点    C++
26 条回复
proxytoworld
2023-10-07 18:23:29 +08:00
....因为你整个命名空间就会是 std 了
MoYi123
2023-10-07 18:27:04 +08:00
没什么特殊原因, 只是像 max,min 这种常用单词, 命名会混淆.
tyzandhr
2023-10-07 18:29:04 +08:00
隔离命名空间
proxytoworld
2023-10-07 18:31:13 +08:00
有几个主要的原因不推荐在 C++中使用 using namespace std:

它可能导致命名冲突(name collisions)

使用 using namespace std 会将 std 命名空间中的所有名称引入当前的命名空间。如果 std 中与你自己的代码中的名称相同,就会导致命名冲突和难以发现的错误。

它污染了命名空间(namespace pollution)

Bringing in all names from std leads to namespace pollution. It becomes less clear which names are defined by your code vs the standard library.

它降低了代码可读性

使用 using namespace std 会让你的代码依赖于一个外部的全局命名空间。这让人无法一眼明白代码中哪些名称是从 std 命名空间来的。

使用命名空间的名字(std::)可以清晰显示出所使用的组件

通过使用命名空间前缀(std::)可以让读代码的人一眼看出你正在使用标准库的组件,增加代码清晰性
cnbatch
2023-10-07 18:32:50 +08:00
因为有些系统 API 的名字恰好跟 std 内的相同,比如最常见的之一,bind()

using namespace 之后,就会出问题:
https://stackoverflow.com/questions/8980384/libc-naming-conflict-for-bind
join
2023-10-07 18:45:03 +08:00
只能说 c++的 namespace 是个非常糟糕的设计。它没有 package 的概念,using 这个关键字你你省略了 namespace 名字。这让代码容易产生重命名错误。后来设计的语言都极力避免让用户使用 using 这类东西。
cnbatch
2023-10-07 19:42:20 +08:00
@join 那 C# 就是反例了,极力鼓励用户多多 using 。

如果在代码行中写了一长串的 namespace 内的类,IDE 甚至还会给出提示,改用 using 省略掉前面那一长串嵌套 namesapce 。
join
2023-10-07 20:26:20 +08:00
@cnbatch c++的 class static 变量也是同样的语法,这时候和 namespace 非常容易搞混。
cnbatch
2023-10-07 20:52:57 +08:00
@join 已经算好啦,C# 直接英文句号一把梭,若不靠 IDE 的颜色标记,完全无法区分

何况使用 C++的 class static 变量时,不可能在前面加个“using namespace”这样的东西,我觉得还是很好区分的
thiiadoewjwe
2023-10-07 20:55:49 +08:00
可以把命名空间理解成一个村,using namespace A;就是用 A 村的人,using namespace B;就是用 B 村的人,std 也是个村,这三个不同的村里面有同名的人,比如张三,A 村的张三是厨师,B 村的张三是木匠,std 村的张三是电工;你现在准备做一大桌菜,所以想叫 A 村的张三这个厨师,但是你却写了 using namespace std; 那就是本来是 A::张三,现在变成了 std::张三,也就是叫来了 std 的张三这个电工,你让电工来给你做饭,那肯定就错了啊,using namespace 可以理解成是不同村的势力范围
ashong
2023-10-07 20:58:09 +08:00
局部作用域可以用
SupperMary
2023-10-07 22:09:44 +08:00
举个例子,socket 里面有一个 bind 函数用来绑定某个端口,C++ 有个 std::bind ,你用了 using namespace std 的话,你输 bind ,IDE 不一定知道是到底是哪个 bind 。
Hsinyao
2023-10-07 22:33:52 +08:00
调内置库函数时加一个 std::前缀非常有仪式感,不加就显得很土😇
kneo
2023-10-07 23:33:08 +08:00
相比 c#,c++应该还有一个远古的 include 的问题。头文件里老老实实用全写。
vituralfuture
2023-10-08 00:30:39 +08:00
写 python 不应该 import *,而且 C++已经极力减少标准库名称的长度了
haolongsun
2023-10-08 01:59:40 +08:00
自己一个人的项目随便用,没人管你,多人合作的你敢用等着被喷吧,有同名函数的时候遇到就要恼火了
dayeye2006199
2023-10-08 07:35:48 +08:00
Explicit is better than implicit
chesha1
2023-10-08 09:33:08 +08:00
小项目可以用,还省的多打字
比如 leetcode 刷题默认整个命名空间是 std
wzy44944
2023-10-08 09:48:24 +08:00
公司统计代码提交量的时候可以多统计一些,因为你的代码里有 N 多的 std::
Xbathy
2023-10-08 10:54:45 +08:00
主要是 C++冲突了不会提示是写命名空间之下的冲突了,最近使用 visual studio 写 c++就遇到这问题了,Iunknown 冲突了,但是他不说是哪几个命名空间下的 Iunknown 重复了...也是我才疏学浅了,写 C#太省心了..

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/979593

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX