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

时间:2012-06-07 08:56:55

标签: c++ coding-style

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

namespace foo
{
    void bar();
    …
}

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

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

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

using namespace foo;

void bar()
{
    doSomething();
    …
}

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

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

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

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:6)

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

使用第三种方法,您可以为代码提供更多一致性。如果A位于B内,您始终会使用A::B进行定义。如果A是类,B是类中的函数,则可以编写type A::B(args)。如果A是一个类而B是静态成员,那么您将再次编写type A::B = value。现在A是一个命名空间,但它仍然是相同的概念:BA内定义,因此再次使用A::B更加一致。

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