2012-10-05 51 views
2

我正在制作一个静态库,其中定义的所有东西都在一个名称空间中。但我不确定是应该像定义一个类一样定义方法,还是将它们包装在命名空间中。我要问的是:头文件声明和源代码定义的C++命名空间

这是有效的:

MyThings.h

namespace MyThings { 
    void DoStuff(); 
    void DoOtherStuff(); 
} 

MyThings.cpp

namespace MyThings { 
    void DoStuff() { 
     // Do this. 
    } 

    void DoOtherStuff() { 
     // Do that. 
    } 
} 

或者,我应该把它定义像我想的类方法?:

MyThings.cpp

void MyThings::DoStuff() { 
    // Do this. 
} 

void MyThings::DoOtherStuff() { 
    // Do that. 
} 

我不希望使用using namespace MyThings;,我宁愿使用我的第一个例子,如果它是有效的,我觉得它使代码更具可读性,而不必在每个方法标识符前使用MyThings::

+2

两者都有效。 –

+0

这两种变体的效果都很好。这取决于你的想法。 –

+1

相关(并提供第三个选项的讨论):http://stackoverflow.com/questions/10928686/best-practices-using-namespace-or-reopen-namespace –

回答

9

两者都是有效的,所以你可以根据口味选择你的风格。

有定义使用功能的通告的优势:

void MyThings::DoStuff() { 
    // Do this. 
} 

这是为了做到这一点,该功能必须已经声明。因此,这样的错误:

void MyThings::DoStuf() { 
    // Do this. 
} 

void MyThings::DoStuff(int i) { 
    // Do this. 
} 

当你编译MyThings.cpp被抓到。如果定义

namespace MyThings { 
    void DoStuff(int i) { 
     // Do this. 
    } 
} 

那么你一般不会,直到有人在另一个源文件试图调用函数得到一个错误,和链接器抱怨。很明显,如果你的测试是非垃圾的,你会以这种或那种方式捕捉错误,但是越早越好,并且你可能会从链接器中得到比编译器更好的错误信息。

+0

+1。但我认为你缺少最后 –

+0

+1的部分“必须声明”。由于一些奇怪的原因,我从来没有想到这一点。 –

+0

+1。很好的答案,回答了这个问题,并告诉我使用我想要的方式定义名称空间中的函数的意义。我从来没有想过这件事。 –