2010-01-16 98 views
6

Possible Duplicates:
Why is ‘using namespace std;’ considered a bad practice in C++?
Using std NamespaceC++命名空間 - 「使用」還是明確聲明?

這只是一個偏好問題嗎?或者是有喜歡

using namespace std; 
#include <string> 
myString string; 

#include <string> 
myString std::string; 

一個正當的理由,我想,每一次明確聲明命名空間,而一拖式,避免名稱衝突的可能性(或將編譯器警告含糊不清?)

問:有沒有一種令人信服的論點?

+2

Dupe of http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c在許多許多人中間。 – 2010-01-16 13:28:55

+0

你是對的!爲什麼我沒有找到那些當我搜查?對不起 – Mawg 2010-01-16 13:44:54

回答

4

這是我在同一主題上寫的另一個答案的修改版本。現在版本3。

主要問題是名稱衝突,因爲如果您的代碼中有一個名爲count的變量,並且您的代碼爲using namespace std;,那麼對於您的意思而言,它將是含糊不清的。這不僅僅是countreverseequal也將被包括在內,這些都是通用的標識符。例如,這會導致編譯錯誤:

#include <algorithm> 
using namespace std; 

int count; 
int main(int argc, char* argv[]){ 
    count = 1; 
} 

不顧一切問題的編譯器,它也是人來閱讀你的代碼中的問題。這些額外的5個字符確保旁邊的人維護你的代碼的已知,你的意思到底是什麼,而不必檢查文件的頂部每隔一條線,看看你的意思std::stringmylib::string當你寫string


它也值得注意的是,你不應該把using namspace xyz放在頭文件中,因爲它可以傳播到包含該頭文件的所有文件,即使它們不想使用該名稱空間。這裏的另一個問題是std命名空間還沒有被導入,所以維護者(或者你在3個月的時間裏)添加了一個變量,其名稱與包含在同一個編譯單元中的一些不起眼的std函數相同,然後花一個小時試圖找出編譯錯誤的原因。

(從C++有效),在大多數情況下,這是非常有利於使用

using std::swap 

彷彿有交換的專用版本,編譯器會使用,否則會依傍std::swap 。如果您致電std::swap,則始終使用基本版本,該版本不會調用專用版本(即使它存在)。

例如使用pimpl idiom的代碼。作爲默認拷貝可以拷貝實際實現中的所有數據,因爲所有需要做的就是交換指針。使用專門的交換可以節省大量的執行時間,精心設計的庫應該專門化它。


綜上所述,

  • 總是喜歡在由於傳播一切代價頭using std::swapstd::swap()

  • 避免using namespace std,儘量避免在實現文件中使用它。

  • 成千上萬的using std::foo在每個文件的頂部是不是要走的路。最多用於常用類。

其他都是意見。

+0

大聲笑(幾乎)這個問題的每一個重複都有你的答案...:D – missingfaktor 2010-01-17 05:08:27

2

使用在cpp文件中很好。你會更喜歡標題中的第二種語法,所以你不會讓它們在整個項目中傳播。

3

我個人更喜歡using聲明而不是using指令。

例如:

#include<string> 
using std::string; 

string x="abc"; 

使用using指令帶來了整個命名空間到範圍之後這可能會導致名稱衝突的問題。

欲瞭解更多信息,請閱讀this(強烈推薦)。