在C++中正确使用命名空间指令的方法

4

在各种权威来源中,我看到了各种使用命名空间的方式。C++标准并不关注命名空间的正确使用。

假设我们有以下代码:

example.h

namespace Example {
    class MyClass
    {
    public:
        MyClass();
    } 
}

以下是两种实现方式:

示例1.cpp

#include "example.h"

using namespace Example;

MyClass::MyClass();

example2.cpp

#include "example.h"

namespace Example
{
    MyClass::MyClass();
}

这两种实现在gcc编译时均没有警告,因此更多是代码的纯洁度或美观度的问题。但无论如何,这两种方法各有优缺点?


1
如果你正在寻找“标准”的与样式相关的实践,那么你应该查看核心指南,而不是标准本身。 - user4442671
2
@AlexF,那不是经验法则。在头文件中使用using namespace是灾难的配方。在cpp文件中,它并不根本危险,但是否明智另说。 - user4442671
既然两者都是有效的,这就是一个观点问题。 - Passer By
这里有一个例子,演示了两种产生截然不同结果的情况。我已经在那里评论了哪个是我认为更好的选择。这取决于观点,就我而言。 - StoryTeller - Unslander Monica
@路人甲仅仅因为在C++中有效而去做某事并不是一个好的指导方针。有些有效选项是好的选择,有些是不常见的,有些是不好的,而有些则是非常糟糕的。 - t.niese
“using namespace…” 总是潜在的危险。将作用域限制到绝对最小范围从来不会有坏处。 - Galik
1个回答

1
这两个例子并不相同:
第一个 (using namespace Example;) 允许编译器看到所有当前命名空间中使用的命名空间,这意味着除非存在与其他命名空间冲突,否则无需指定命名空间。
第二个 (namespace Example {...}) 会将符号和代码添加到命名空间中,但从命名空间外部看,它不会被视为在当前命名空间中。
  • 您不需要为当前命名空间声明 using
  • 一个块只能在一个命名空间中,但可以使用多个命名空间。

for example:

//consider the following namespace
Namespace A
{
  void f()
  {

  }
}

main函数中你有两个选项:

使用命名空间调用

int main()
{
  A::f();
  ...
}

或者添加using语句并在不使用命名空间的情况下调用。
using namespace A;
int main()
{
  f();
  ...
}

但是你不能将主函数添加到命名空间中,因为编译器找不到它:

namespace A {
  int main()
  {
    f();
    ...
  }
}

将会出现错误:

undefined reference to `main'

。该错误与编程有关,表示找不到主函数的引用。HTML标记已保留,无需解释。

虽然你的答案在技术上是正确的,但我担心对于 OP 来说可能会产生误导,因为在他的示例中,他正在定义已在该命名空间中声明过的符号。 - user4442671
@Frank 添加了示例 - SHR
感谢@SHR的回答!但正如@Frank已经注意到的,我的答案有点不同。在我的例子中,MyClass已经以正确的方式在命名空间内定义。唯一的问题是 - 这样做是否正确?或者更正确地说 - 如果有两种方法可以做某事,我应该选择哪一种?对我来说,我更喜欢使用using namespace指令。但是可能每种方法都有其缺点... - folibis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接