2010-07-09 73 views
2

我們可以像下面的代碼片段一樣使用名稱空間嗎?代碼在gcc和msvc中編譯,讓我對命名空間的用法感到困惑。在C++中使用名稱空間

在f1.h:

 
namespace My 
{ 
void foo(); 
} 

在f1.cpp '

 
void My::foo() 
{ 
} 

我認爲功能應該被定義爲:

 
namespace My { 
void foo() {} 
} 

任何人都可以善意解釋N +

謝謝

回答

8

只要名稱空間的名稱前綴是名稱空間的名稱,並且該名稱空間實際上是在封裝名稱空間的名稱空間中進行定義,那麼在名稱空間外部定義名稱空間成員是合法的。它不能發生在嵌套在成員命名空間內的命名空間中。

namespace A { void f(); } 
void A::f() { } // prefix with "A::" 

namespace B { } 
void B::f() { } // invalid! not declared in B! 

namespace C { void f(); } 
namespace D { void C::f() { } } // invalid! D doesn't enclose C 

namespace E { 
    void f(); 
    namespace F { 
    void E::f() { } // invalid! F is nested inside E! 
    } 
} 

這是同樣的東西,作爲類的成員,在這裏你還可以定義函數的類外,只要你與類的名稱前綴名稱。但是對於類,命名空間成員必須首先在其各自的名稱空間中聲明,然後才能在外部定義它們。

+0

哪種方式比較習慣? – Philipp 2010-07-09 08:32:57

+0

@Philipp我直接定義內聯函數,並分別定義其他函數。尤其是如果有一個頭文件/實現文件分離。 – 2010-07-09 08:34:27

+0

這不是一種重言式嗎?在類定義中定義的函數始終是內聯的。我的意思是使用'A :: f'或'namespace A {f}'來定義獨立函數。至少Boost似乎更喜歡後者。 – Philipp 2010-07-09 10:16:27

0

是的,那很好。通過執行「My ::」,您表示您正在使用「My」命名空間。

,你可以聲明一個STL向量作爲「的std ::矢量< int>的」 ......用同樣的方法

0

兩個是真的

你可以設置全局或每個功能

命名空間
namespace My { 
//in this are functions are in "My" namespace 
} 

namespace Your { 
//in this are functions are in "Your" namespace 
} 

My::foo() {} 
My::bar() {} 
Your::foo() {} 

,如果你不想寫「我::」在每一個功能,開始喲你把它寫成第一個。當有多個命名空間時,第二個是有用的

0

它與do相同:using std namespace;在頂部,只是做cout而不是做std :: cout。兩者都可以工作,兩者都有效,但你必須考慮如何使用它們。有專業和缺點。

0

我想,這是允許的:

namespace My 
{ 
void foo(); 
} 

,因爲這意味着,如果一個實用的方法是很長時間不弄亂的頭文件。這樣,更明顯的是名稱空間中提供了哪些方法。

我知道這可能與現代IDE的表現力無關,但它仍然有助於擁有乾淨的頭文件。

相關問題