2012-03-29 57 views
1

可能重複:
Is it a good idea to wrap an #include in a namespace block?我們應該將#include放入命名空間嗎?

// Method One 
#ifndef XXX_H 
#define XXX_H 
#include <iostream> 
#include "myhead.h" 
namespace XXX 
{ 
    /... 
} 
#endif 

OR 

// Method Two 
namespace XXX 
{ 
#ifndef XXX_H 
#define XXX_H 

    #include <iostream> 
    #include "myhead.h" 
    /... 
#endif 
} 

當我們定義一個新的namespace XXX,我們應該將#include directive內部命名空間或沒有?

謝謝

+0

http://stackoverflow.com/a/2868971/76173 – thorn 2012-03-29 16:01:07

回答

6

你必須不是包括你的名字空間內的<iostream>。你會得到鏈接錯誤。

我不會建議在命名空間中包含任何頭文件。

唯一的例外是你只有一個只定義了extern "C"函數(並且沒有C++函數或類)的頭文件,你通常可以將它包含在名稱空間中而不會導致鏈接器問題。但它可能不是一個好主意。

+0

它不會導致缺少定義鏈接器錯誤,但它很容易導致重複定義鏈接器錯誤,因爲它並沒有真正將定義放在名稱空間中。 – 2012-03-29 16:42:25

2

這取決於你想要什麼,因爲兩者都不相同。他們每個人意味着不同的事情。

如果你將它們包含在命名空間中,那麼heades將在命名空間內部展開,這意味着頭部中的所有名稱將在命名空間中聲明/定義,在你的情況下是XXX

所以,如果你想這樣做,你可以做到這一點。如果你不想這樣做,那顯然你不應該那樣做。

請注意,如果您包含在命名空間中,那麼對於您在.cpp文件中定義的那些符號,在XXX名稱空間內沒有定義的符號,可能會出現鏈接器錯誤。所以聲明將在名稱空間XXX::ABC中,而定義將位於名稱空間ABC中。所以由於這個原因,如果你在XXX命名空間中包括這個,你將得到來自<iostream>的符號的鏈接器錯誤。

0

據我所知..第一個是更好的編碼實踐..再那空間外面只有我..

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – tune2fs 2012-11-15 05:52:39

+0

@ tune2fs:不同意:它*是*和答案,只是不是很好備份或有用的。 – Mac 2012-11-15 05:58:29

1

不,你應該做你的#includes。否則,你會打亂你包含的頭文件中的所有東西的名字。在上面發佈的情況下,您將會破壞標準庫元素的名稱;它甚至不可能成功構建。

相關問題