代码之家  ›  专栏  ›  技术社区  ›  Rob

你喜欢C++中的显式命名空间还是“使用”?

  •  16
  • Rob  · 技术社区  · 16 年前

    当使用C++命名空间时,您喜欢显式地命名它们,像这样:

    std::cout << "Hello, world!\n";
    

    还是你更喜欢 using namespace :

    using namespace std;
    cout << "Hello, world!\n";
    

    如果您喜欢后者,您是否在文件或函数范围内声明您的使用?

    就我个人而言,我更喜欢显式地命名它们——这更像是输入,但是当使用混合名称空间(例如 std boost )我觉得它更可读。

    8 回复  |  直到 16 年前
        1
  •  17
  •   Ferruccio    16 年前

    我总是使用 using namespace 用于标准和增强。除此之外,我倾向于使用一个明确的名称空间,除非它被使用得太多,以致于代码混乱。

    在标题中,我从不使用 使用命名空间 以避免污染包括源的全局命名空间。

        2
  •  19
  •   Ferruccio    16 年前

    我总是使用明确的。写性病不会伤害我,我清楚地知道它来自哪里。当您有一些遗留项目需要处理它自己的“字符串”、“向量”等需要维护时,它是有用的。代码携带的信息越多越好。

        3
  •  19
  •   Konrad Rudolph    16 年前

    额外的打字不是这里的问题。显式限定名的问题是视觉混乱。让我们面对它,C++语法不整洁。无需通过不必要地将名称变长并慷慨地将代码洒在 :: S.

    我和杰夫·阿特伍德在一起: The Best Code is No Code At All . 这是真的。

    名称空间导入是减少混乱的一个很好的方法,没有缺点:只要打开的名称空间的范围减少到一个编译单元 ,如果出现名称冲突,可以轻松解决。

    为什么直白的名字(通常)应该更易读一直是我的一个谜。读者通常应该对代码有足够的了解,以便能够推断出语义。如果不是,代码无论如何都需要修复。


    1) 推论:没有 using 在头上!

        4
  •  4
  •   Gerald    16 年前

    我的一般规则是总是显式地在头中使用名称空间,并且通常在代码中使用。前者的原因是在定义的每个部分中明确地说明正在使用的内容,而后者的原因是,如果需要的话,可以很容易地使用来自另一个命名空间的替换。例如,如果我们想开始使用foo::string而不是std::string,我们只需要更新头和using语句,而不是用代码中的foo::string替换std::string的每个实例。

    当然,对于驻留在std::namespace中的类来说,这是不太有用的,因为即使替换一个类,您仍然可能在std中使用其他类,并且可能会遇到歧义问题,但这只是一个例子。

        5
  •  4
  •   xtofl Adam Rosenfield    16 年前

    using using namespace 对于使代码更可读非常有用-消除混乱。

    但是,在任何情况下,如果发现符号的来源都比较困难,我都会拒绝导入它的整个名称空间。

    我尝试限制导入命名空间的范围:

    void bar() {
    
       // do stuff without vector
    
       { using std::vector;
          // do stuff with vector
       }
    
       // do stuff without vector
    }
    

    对于“众所周知”的图书馆,比如 std ,我敢用 using namespace std . 有理由相信每个阅读这段代码的人都知道这些符号。

    作为旁注, 使用 关键字还用于指示派生类还导出其超类的重载成员。

    class A {
      void f( A  );
      void f( bool );
    };
    
    class B : public A {
      using A::f; // without this, we get a compilation error in foo()
      void f(bool);
    };
    
    void foo() {
      B b;
      b.f( A() ); // here's a compilation error when no `using` is used in B
    }
    
        6
  •  2
  •   Bill the Lizard Alexis MP    16 年前

    我只在有一些歧义时使用显式名称空间。它更易读,但是额外的输入太繁琐,您必须假设其他开发人员对标准库有一个基线级别的熟悉。

    只有在我拼出一个名称空间的其他时候,我才使用它一次或两次,比如添加一个快速调试语句,或者使用一些非标准库。

    我通常在文件范围内声明名称空间,但是如果混合名称空间,那么将声明放在函数范围内更靠近使用它的点可能是有意义的。

        7
  •  2
  •   Len Holgate    16 年前

    我倾向于在.cpp文件的顶部显式地导入我需要的名称,所以…

    使用std::cout; 使用std::endl;

    等。。。

    这样我就可以控制我使用的名称,很容易看到它们来自何处,并且代码在使用时不会杂乱无章。

    在极少数情况下,我使用来自不同名称空间的两个名称,在使用时完全限定它们。

    我总是在头中使用完全限定的名称,几乎不在任何地方使用“使用名称空间X”…

        8
  •  1
  •   Nemanja Trifunovic    16 年前

    using 在函数范围内,或者如果函数非常小(通常是),只需要显式名称空间