您更喜欢C ++中的显式名称空间还是“使用”?

时间:2008-10-18 11:30:23

标签: c++ namespaces using

使用C ++命名空间时,您更喜欢显式命名它们,如下所示:

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

或者您更喜欢using namespace

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

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

就我个人而言,我更喜欢明确地命名它们 - 它更多的是打字,但是当使用混合的命名空间(例如stdboost)时,我发现它更具可读性。

8 个答案:

答案 0 :(得分:20)

额外打字不是问题。显式限定名称的问题是视觉混乱。让我们面对现实,C ++语法不整洁。不必通过不必要地更长时间地使名称变得更糟,并且用:: s慷慨地填充代码。

我和Jeff Atwood在一起:The Best Code is No Code At All。这是真的。

命名空间导入是减少混乱的好方法,没有任何缺点:只要打开的命名空间的范围减少到单个编译单元 1 ,名称冲突(如果出现)可以解决容易。

为什么显式名称(通常)应该更易读,对我来说一直是个谜。读者通常应该知道代码足够好以便能够推断出语义。如果不是,代码仍需要修复。


1)推论:标题中没有using

答案 1 :(得分:19)

我总是使用明确的。写std不会伤害我,我清楚地看到它来自哪里。当你有一些遗留项目来处理它自己的“字符串”,“向量”等维护时,这很有用。代码携带的信息越多越好。

答案 2 :(得分:17)

我总是将using namespace用于std&amp;促进。其他所有我倾向于使用显式命名空间,除非它被大量使用以至于会使代码混乱。

在标题中,我从不使用using namespace来避免污染#including源的全局命名空间。

答案 3 :(得分:4)

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

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

答案 4 :(得分:4)

usingusing namespace非常有用,可以使代码更具可读性 - 消除混乱。

但是在任何情况下,如果找到符号的来源更加困难,我会拒绝导入它的整个命名空间。

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

void bar() {

   // do stuff without vector

   { using std::vector;
      // do stuff with vector
   }

   // do stuff without vector
}

对于“一般已知”的库,例如std,我敢于使用using namespace std。有理由相信阅读此代码的每个人都知道这些符号。

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

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
}

答案 5 :(得分:2)

当出现歧义时,我只使用显式名称空间。它更具可读性,但额外的输入过于繁琐,您必须假设其他开发人员对标准库有基准级别的熟悉程度。

我拼出命名空间的唯一其他时间是我只使用一次或两次,例如添加快速调试语句,或者我使用的是非标准库。

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

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

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

等...

通过这种方式,我可以控制我使用的名称,并且很容易看到它们来自哪里,并且代码在使用时不会混乱。

在极少数情况下,我使用来自不同命名空间的两个名字,我在使用时完全符合它们。

我总是在标题中使用完全限定名称,并且几乎没有在任何地方使用'使用命名空间x'...