1
proxytoworld 2023-10-07 18:23:29 +08:00
....因为你整个命名空间就会是 std 了
|
2
MoYi123 2023-10-07 18:27:04 +08:00
没什么特殊原因, 只是像 max,min 这种常用单词, 命名会混淆.
|
3
tyzandhr 2023-10-07 18:29:04 +08:00 via Android
隔离命名空间
|
4
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::)可以让读代码的人一眼看出你正在使用标准库的组件,增加代码清晰性 |
5
cnbatch 2023-10-07 18:32:50 +08:00
因为有些系统 API 的名字恰好跟 std 内的相同,比如最常见的之一,bind()
using namespace 之后,就会出问题: https://stackoverflow.com/questions/8980384/libc-naming-conflict-for-bind |
6
join 2023-10-07 18:45:03 +08:00 via iPhone 3
只能说 c++的 namespace 是个非常糟糕的设计。它没有 package 的概念,using 这个关键字你你省略了 namespace 名字。这让代码容易产生重命名错误。后来设计的语言都极力避免让用户使用 using 这类东西。
|
7
cnbatch 2023-10-07 19:42:20 +08:00
@join 那 C# 就是反例了,极力鼓励用户多多 using 。
如果在代码行中写了一长串的 namespace 内的类,IDE 甚至还会给出提示,改用 using 省略掉前面那一长串嵌套 namesapce 。 |
9
cnbatch 2023-10-07 20:52:57 +08:00
@join 已经算好啦,C# 直接英文句号一把梭,若不靠 IDE 的颜色标记,完全无法区分
何况使用 C++的 class static 变量时,不可能在前面加个“using namespace”这样的东西,我觉得还是很好区分的 |
10
thiiadoewjwe 2023-10-07 20:55:49 +08:00 1
可以把命名空间理解成一个村,using namespace A;就是用 A 村的人,using namespace B;就是用 B 村的人,std 也是个村,这三个不同的村里面有同名的人,比如张三,A 村的张三是厨师,B 村的张三是木匠,std 村的张三是电工;你现在准备做一大桌菜,所以想叫 A 村的张三这个厨师,但是你却写了 using namespace std; 那就是本来是 A::张三,现在变成了 std::张三,也就是叫来了 std 的张三这个电工,你让电工来给你做饭,那肯定就错了啊,using namespace 可以理解成是不同村的势力范围
|
11
ashong 2023-10-07 20:58:09 +08:00
局部作用域可以用
|
12
SupperMary 2023-10-07 22:09:44 +08:00
举个例子,socket 里面有一个 bind 函数用来绑定某个端口,C++ 有个 std::bind ,你用了 using namespace std 的话,你输 bind ,IDE 不一定知道是到底是哪个 bind 。
|
13
Hsinyao 2023-10-07 22:33:52 +08:00 via Android 10
调内置库函数时加一个 std::前缀非常有仪式感,不加就显得很土😇
|
14
kneo 2023-10-07 23:33:08 +08:00 via Android
相比 c#,c++应该还有一个远古的 include 的问题。头文件里老老实实用全写。
|
15
vituralfuture 2023-10-08 00:30:39 +08:00 via Android
写 python 不应该 import *,而且 C++已经极力减少标准库名称的长度了
|
16
haolongsun 2023-10-08 01:59:40 +08:00
自己一个人的项目随便用,没人管你,多人合作的你敢用等着被喷吧,有同名函数的时候遇到就要恼火了
|
17
dayeye2006199 2023-10-08 07:35:48 +08:00 via Android
Explicit is better than implicit
|
18
chesha1 2023-10-08 09:33:08 +08:00
小项目可以用,还省的多打字
比如 leetcode 刷题默认整个命名空间是 std |
19
wzy44944 2023-10-08 09:48:24 +08:00
公司统计代码提交量的时候可以多统计一些,因为你的代码里有 N 多的 std::
|
20
Xbathy 2023-10-08 10:54:45 +08:00
主要是 C++冲突了不会提示是写命名空间之下的冲突了,最近使用 visual studio 写 c++就遇到这问题了,Iunknown 冲突了,但是他不说是哪几个命名空间下的 Iunknown 重复了...也是我才疏学浅了,写 C#太省心了..
|
21
frings 2023-10-08 11:39:54 +08:00
@proxytoworld 这看着很 gpt 呀
|
22
kx5d62Jn1J9MjoXP 2023-10-08 13:16:59 +08:00
因为你写的代码里 namespace 除了 std 就没有别的
但是实际的代码里 namespace 一大堆 |
23
proxytoworld 2023-10-08 13:58:34 +08:00
@frings claude 生成的
|
24
weeei 2023-10-08 21:52:29 +08:00
大佬们说的应该是,不要在全局范围内写 using namespace xx ,不管是 std 还是其他的。重点是不要全局范围内这么写。局部是没有问题的。
|
25
7B2fWg4Y9X 2023-10-09 13:42:11 +08:00 1
了解这行代码会给你的项目,代码带来什么,随着你的学习你会深入这个问题然后得出利弊。而不是别人说什么就是什么
|
26
zorchp1 2023-11-08 00:18:40 +08:00 via Android
实际遇到一个问题,使用 using namespace std 之后,全局变量使用 data 命名就会出现问题,而且编译器检查不出来。。
|