V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
okura
V2EX  ›  C++

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

  •  1
     
  •   okura · 2023-10-07 17:53:04 +08:00 via Android · 4090 次点击
    这是一个创建于 442 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚刚学 c++没多久,看到很多代码还有很多大佬都是说不要写 using namespace std ,为什么呢?求助各位大佬
    26 条回复    2023-11-08 00:18:40 +08:00
    proxytoworld
        1
    proxytoworld  
       2023-10-07 18:23:29 +08:00
    ....因为你整个命名空间就会是 std 了
    MoYi123
        2
    MoYi123  
       2023-10-07 18:27:04 +08:00
    没什么特殊原因, 只是像 max,min 这种常用单词, 命名会混淆.
    tyzandhr
        3
    tyzandhr  
       2023-10-07 18:29:04 +08:00 via Android
    隔离命名空间
    proxytoworld
        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::)可以让读代码的人一眼看出你正在使用标准库的组件,增加代码清晰性
    cnbatch
        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
    join
        6
    join  
       2023-10-07 18:45:03 +08:00 via iPhone   ❤️ 3
    只能说 c++的 namespace 是个非常糟糕的设计。它没有 package 的概念,using 这个关键字你你省略了 namespace 名字。这让代码容易产生重命名错误。后来设计的语言都极力避免让用户使用 using 这类东西。
    cnbatch
        7
    cnbatch  
       2023-10-07 19:42:20 +08:00
    @join 那 C# 就是反例了,极力鼓励用户多多 using 。

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

    何况使用 C++的 class static 变量时,不可能在前面加个“using namespace”这样的东西,我觉得还是很好区分的
    thiiadoewjwe
        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 可以理解成是不同村的势力范围
    ashong
        11
    ashong  
       2023-10-07 20:58:09 +08:00
    局部作用域可以用
    SupperMary
        12
    SupperMary  
       2023-10-07 22:09:44 +08:00
    举个例子,socket 里面有一个 bind 函数用来绑定某个端口,C++ 有个 std::bind ,你用了 using namespace std 的话,你输 bind ,IDE 不一定知道是到底是哪个 bind 。
    Hsinyao
        13
    Hsinyao  
       2023-10-07 22:33:52 +08:00 via Android   ❤️ 10
    调内置库函数时加一个 std::前缀非常有仪式感,不加就显得很土😇
    kneo
        14
    kneo  
       2023-10-07 23:33:08 +08:00 via Android
    相比 c#,c++应该还有一个远古的 include 的问题。头文件里老老实实用全写。
    vituralfuture
        15
    vituralfuture  
       2023-10-08 00:30:39 +08:00 via Android
    写 python 不应该 import *,而且 C++已经极力减少标准库名称的长度了
    haolongsun
        16
    haolongsun  
       2023-10-08 01:59:40 +08:00
    自己一个人的项目随便用,没人管你,多人合作的你敢用等着被喷吧,有同名函数的时候遇到就要恼火了
    dayeye2006199
        17
    dayeye2006199  
       2023-10-08 07:35:48 +08:00 via Android
    Explicit is better than implicit
    chesha1
        18
    chesha1  
       2023-10-08 09:33:08 +08:00
    小项目可以用,还省的多打字
    比如 leetcode 刷题默认整个命名空间是 std
    wzy44944
        19
    wzy44944  
       2023-10-08 09:48:24 +08:00
    公司统计代码提交量的时候可以多统计一些,因为你的代码里有 N 多的 std::
    Xbathy
        20
    Xbathy  
       2023-10-08 10:54:45 +08:00
    主要是 C++冲突了不会提示是写命名空间之下的冲突了,最近使用 visual studio 写 c++就遇到这问题了,Iunknown 冲突了,但是他不说是哪几个命名空间下的 Iunknown 重复了...也是我才疏学浅了,写 C#太省心了..
    frings
        21
    frings  
       2023-10-08 11:39:54 +08:00
    @proxytoworld 这看着很 gpt 呀
    kx5d62Jn1J9MjoXP
        22
    kx5d62Jn1J9MjoXP  
       2023-10-08 13:16:59 +08:00
    因为你写的代码里 namespace 除了 std 就没有别的
    但是实际的代码里 namespace 一大堆
    proxytoworld
        23
    proxytoworld  
       2023-10-08 13:58:34 +08:00
    @frings claude 生成的
    weeei
        24
    weeei  
       2023-10-08 21:52:29 +08:00
    大佬们说的应该是,不要在全局范围内写 using namespace xx ,不管是 std 还是其他的。重点是不要全局范围内这么写。局部是没有问题的。
    7B2fWg4Y9X
        25
    7B2fWg4Y9X  
       2023-10-09 13:42:11 +08:00   ❤️ 1
    了解这行代码会给你的项目,代码带来什么,随着你的学习你会深入这个问题然后得出利弊。而不是别人说什么就是什么
    zorchp1
        26
    zorchp1  
       2023-11-08 00:18:40 +08:00 via Android
    实际遇到一个问题,使用 using namespace std 之后,全局变量使用 data 命名就会出现问题,而且编译器检查不出来。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2761 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 14:46 · PVG 22:46 · LAX 06:46 · JFK 09:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.