14

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

namespace foo
{
    void bar();
    …
}

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

namespace foo
{
void bar()
{
    doSomething();
    …
}
}

那是因为我是通过这种方式学习它的,并且它被用于我正在从事的项目中。直到最近,当我偶然发现一个使用 using 指令的项目时,我才真正考虑过它:

using namespace foo;

void bar()
{
    doSomething();
    …
}

最后还有一个使用全名的选项。我觉得这很乏味,尤其是当涉及到很多成员的课程时。在我看来,当文件的所有内容都是一个命名空间的一部分时,它没有多大意义。

void foo::bar()
{
    doSomething();
    …
}

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

4

2 回答 2

14

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

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

尽管这using namespace是最懒惰的(因此也是最诱人的)解决方案,但它通常不是一个好主意。除了 Luchian 所说的函数声明模棱两可(项目的新手不知道这是独立函数还是命名空间中的一个),以及您稍后可能会在命名空间中引入一个名称的事实,与您的一个冲突现在使用,我有另一个理由建议使用第三种方法。

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

(如果你的编辑器是 ViM,那么搜索能力还有一个额外的好处)

于 2012-06-07T09:14:52.977 回答