假设我在头文件中声明了一个函数(或类,无所谓),它是命名空间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文件,除非您知道该命名空间存在,否则您无法从命名空间实现函数.首先想到的是你正在实现一个类成员函数.即使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,还有额外的搜索能力奖励)