2

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

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

} // foo

或者

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

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

4

4 回答 4

6

我会拒绝第一个(编辑:问题改变了,第一个也是我现在更喜欢的)。由于仅从函数定义来看,尚不清楚 Bar 指的是哪里。此外,使用您的一种方法,可能会出现滑溜的错误:

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 是命名空间而 Bar 是类?

于 2008-11-18T20:55:11.877 回答
5

我更喜欢未列出的选项:

namespace foo {

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

}  // foo namespace

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

于 2008-11-18T20:55:48.540 回答
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 的示例在两个不同的命名空间中都有两个类会使编译器和程序员都感到困惑,应该避免。

于 2008-11-18T22:25:20.870 回答
1

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

于 2008-11-18T20:54:55.280 回答