最佳实践:使用命名空间还是重新打开命名空间?

sta*_*tiv 14 c++ coding-style

假设我在头文件中声明了一个函数(或类,无所谓),它是命名空间foo的一部分:

namespace foo
{
    void bar();
    …
}
Run Code Online (Sandbox Code Playgroud)

很久以来,当我在cpp文件中定义函数时,我一直在重新打开命名空间:

namespace foo
{
void bar()
{
    doSomething();
    …
}
}
Run Code Online (Sandbox Code Playgroud)

那是因为我以这种方式学习它并且它被用于我正在进行的项目中.直到最近,当我偶然发现一个使用using指令的项目时,我从未真正想过它:

using namespace foo;

void bar()
{
    doSomething();
    …
}
Run Code Online (Sandbox Code Playgroud)

最后,可以选择使用全名.我发现它非常繁琐,特别是当涉及到很多成员的课程时.在我看来,当文件的所有内容都是一个命名空间的一部分时,它没有多大意义.

void foo::bar()
{
    doSomething();
    …
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是哪一个应该是首选,为什么?特别是关于前两个选项(使用指令与重新打开命名空间).

Luc*_*ore 13

我认为最干净的方法是重新打开命名空间,我有支持它的参数:

  • 使用您的第二个选项,使用该using指令,您不清楚是否在该命名空间中实现了一个方法.你也可以实现一个使用命名空间中的东西的自由函数.
  • 第三个选项通常用于实现类成员函数.如果直接查看该cpp文件,除非您知道该命名空间存在,否则您无法从命名空间实现函数.首先想到的是你正在实现一个类成员函数.
  • 第一个是最清楚的.您打开命名空间并在其中定义一个函数.该函数是命名空间的一部分,这是实现.

  • 同样,我认为你应该发明任何你喜欢的风格指南.我只是认为你高估了看到合格名称`foo :: bar`的实际可能性,并且严重混淆`foo`是名称空间还是类. (2认同)

Sha*_*baz 6

即使using namespace是最懒惰的(因此也是最诱人的)解决方案,它通常不是一个好主意.除了Luchian所说的函数声明不明确之外(项目的新手不知道这是独立函数还是命名空间中的一个),以及您可能稍后在命名空间中引入一个名称,与之相撞的事实现在使用,我有另一个原因,我建议使用第三种方法.

使用第三种方法,可以使代码更加一致.如果A在里面B,你总是会定义它A::B.如果A是类中的类和B函数,则可以编写type A::B(args).如果A是一个类和B一个静态成员,你会再次写type A::B = value.现在A是命名空间,但它仍然是相同的概念:B在内部定义A,因此再次使用它更加一致A::B.

(如果你的编辑是例如ViM,还有额外的搜索能力奖励)