假设我在头文件中声明了一个函数(或类,无所谓),它是命名空间foo的一部分:
namespace foo
{
void bar();
…
}
在我在cpp文件中定义函数时,我一直在重新打开命名空间:
namespace foo
{
void bar()
{
doSomething();
…
}
}
那是因为我以这种方式学习它并且它被用于我正在进行的项目中。直到最近,我偶然发现了一个使用using指令的项目:
using namespace foo;
void bar()
{
doSomething();
…
}
最后,可以选择使用全名。我发现它非常繁琐,特别是当涉及到很多成员的课程时。在我看来,当文件的所有内容都是一个命名空间的一部分时,它没有多大意义。
void foo::bar()
{
doSomething();
…
}
所以我的问题是哪一个应该是首选的,为什么?特别是关于前两个选项(使用指令与重新打开命名空间)。
答案 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
是一个命名空间,但它仍然是相同的概念:B
在A
内定义,因此再次使用A::B
更加一致。
(如果您的编辑是例如ViM,还有额外的搜索能力奖励)