使用C ++命名空间时,您更喜欢显式命名它们,如下所示:
std::cout << "Hello, world!\n";
或者您更喜欢using namespace
:
using namespace std;
cout << "Hello, world!\n";
如果您更喜欢后者,是否在文件或功能范围内声明您的使用?
就我个人而言,我更喜欢明确地命名它们 - 它更多的是打字,但是当使用混合的命名空间(例如std
和boost
)时,我发现它更具可读性。
答案 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)
using
和using 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'...