2012-10-05 88 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。很好的答案,回答了這個問題,並告訴我使用我想要的方式定義名稱空間中的函數的意義。我從來沒有想過這件事。 –