源文件的首选命名空间语法

时间:2008-11-18 20:48:50

标签: c++ namespaces

假设名为Bar的名称空间中有一个名为foo的类,您更喜欢哪种语法来源(.cpp / .cc)文件?

namespace foo {
...
void Bar::SomeMethod()
{
    ...
}

} // foo

void foo::Bar::SomeMethod()
{
    ...
}

我使用命名空间并且更喜欢第一种语法,但是当使用Visual Studio类向导(WM_COMMAND处理程序等)添加代码时,自动生成的代码使用第二种语法。一种语法优于另一种语法有什么优势吗?

4 个答案:

答案 0 :(得分:6)

我会拒绝第一个(编辑:问题已更改,第一个是我现在更喜欢的)。因为仅仅通过查看函数定义而不清楚Bar所指的位置。此外,使用 first 方法,可能会出现slippy错误:

namespace bar { 
     struct foo { void f(); };
}

namespace baz { 
    struct foo { void f(); };
}

using namespace bar;
using namespace baz;

void foo::f() { // which foo??

}

因为它在当前范围(它是全局范围)中查找,所以它找到两个foo,并告诉你对它的引用是不明确的。

就我个人而言,我会这样做:

namespace foo {
void Bar::SomeMethod() {
    // something in here
}
}

从仅查看SomeMethod的定义到它所属的命名空间还不清楚,但是你有一个命名空间范围,你可以很容易地查找它。此外,现在很清楚Bar指的是名称空间foo。

你展示的第二种方式实际上对我来说打字太多了。另外,第二种方式可能会导致代码的新读者混淆:foo是类,还是Bar的嵌套类?或者foo是一个命名空间并且禁止该类?

答案 1 :(得分:5)

我更喜欢未列出的选项:

namespace foo {

void Bar::SomeMethod()
{
    ...
}

}  // foo namespace

与选项一不同,这使得您的代码显然属于foo命名空间,而不仅仅是使用它。与选项二不同,它节省了大量的输入。双赢。

答案 2 :(得分:2)

我宁愿选择第一种情况,明确标记名称空间:

namespace TheNamespace {
void TheClass::TheMethod() {
   // code
}
}

原因是从语法中可以清楚地看出,TheClass是一个类,而TheNamespace是一个命名空间(任何其他名称都不那么明显)。如果代码是

void TheNamespace::TheClass::TheMethod() {
   // code
}

然后读者无法清楚地看到TheNamespace是一个名称空间,还是一个内部类名为TheClass的类。

class TheClass1
{
   class TheClass2
   {
      void TheMethod();
   }
};

void TheClass1::TheClass2::TheMethod() {
   // code
}

我倾向于避免使用'using'语句,即使这样,litb在两个不同的命名空间中使用两个类的例子也会使编译器和程序员感到困惑,应该避免使用。

答案 3 :(得分:1)

我认为这取决于每个案例。如果它是与您自己的代码类似的第三方库,并且您希望避免代码中的混淆,那么在每次出现时指定完整的命名空间可能是有益的。但除此之外,较少的代码通常更好(除非它变得不清楚)。