代码之家  ›  专栏  ›  技术社区  ›  Rob

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

  •  2
  • Rob  · 技术社区  · 16 年前

    假设一个类 Bar 在名为 foo ,对于源(.cpp/.cc)文件,您更喜欢使用哪种语法?

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

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

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

    4 回复  |  直到 16 年前
        1
  •  6
  •   Johannes Schaub - litb    16 年前

    我会拒绝第一个( 编辑 :问题变了,第一个是我现在也更喜欢的问题)。因为仅仅从函数定义来看,还不清楚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
    }
    }
    

    仅仅查看它所属命名空间的某个方法的定义也是不清楚的,但是在它周围有一个命名空间范围,您可以很容易地查看它。此外,现在很明显,bar引用了名称空间foo。

    第二种方式,你会显示太多的打字我实际上。另外,第二种方法可能会在新的代码阅读器中引起混淆:foo是类吗,它是一个嵌套类吗?或者foo是一个名称空间并禁止类?

        2
  •  5
  •   hazzen    16 年前

    我更喜欢未列出的选项:

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

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

        3
  •  2
  •   David Rodríguez - dribeas    16 年前

    我宁愿选择第一种情况,其中名称空间被显式标记为:

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

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

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

    然后,读者就不清楚名称空间是命名空间,还是类名为该类的内部类。

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

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

        4
  •  1
  •   GeekyMonkey    16 年前

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