2011-03-29 33 views
9

可能重複:
Why is 'using namespace std;' considered a bad practice in C++?爲什麼std ::由有經驗的編碼人員使用,而不是使用命名空間std;?

有一天,當我問一個問題有人回答道說,如果有人問一個問題,告訴他們這樣做,而不是using namespace std;正確的方式,我認爲有點奇怪,因爲using namespace std;的方式更容易,但我想我現在失敗了,因爲我是一個'初學者'的編碼器,你們知道更好。

所以我想我的問題是: 爲什麼std::而不是using namespace std;

謝謝。

+2

請參閱http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c – Sapph 2011-03-29 07:18:03

回答

20

從C++ FAQ:

我應該在我的代碼使用using namespace std

可能不是。

人們不喜歡打字std::超過 和結束,他們發現 using namespace std讓編譯器看到 任何std名,即使不合格。 美中不足的是它讓 編譯器看到任何std名稱,甚至 那些你沒有想到的。在 換句話說,它可以創建名稱 衝突和歧義。

https://isocpp.org/wiki/faq/coding-standards#using-namespace-std

+0

+!:很好的報價,說一切。 – 2011-03-29 07:16:08

+1

是否有任何效率提升或者是非問題? – chustar 2011-03-29 07:19:20

+0

@chustar:「效率」是什麼意思? – 2011-03-29 07:22:12

0

命名空間(S)是我們的變量額外的預選賽。假設我們在std中定義了「字符串」,現在如果我們還在mynamespace中定義了「字符串」。

現在,如果我在文件的頂部寫入using namespace std;,那麼從那裏開始,字符串變得對編譯器不明確。

然而,人們可能會採取中間方法,在頭文件(.h)文件中嚴格沒有using namespace std;,因爲其他人可能想使用您的類並可能發生衝突。雖然對於實現(.cxx)文件,但如果確信不會有任何衝突,則可以小心使用它。

4

簡而言之,您不太可能錯誤地使用錯誤的類型或函數或名稱衝突。假設你正在使用自己的數學庫,加上std,並以任意順序聲明使用它們。現在,他們都定義了函數pow。當你調用pow時,你使用了哪個pow?我認爲這是值得的額外的打字。

2

我不認爲這是更有經驗的程序員使用顯式名稱空間的情況,Do you prefer explicit namespaces or 'using' in C++?

不過請注意,你不應該導入頭文件的命名空間,而且在某些情況下,明確的名稱空間更清晰,例如與功能std::min()std::max()

1

我認爲這是一些什麼樣的偏好的事情。有些人喜歡在使用類時看到顯式的命名空間。 一個例外是我永遠不要在頭文件中使用std命名空間。因爲這可能會意外地更改使用此頭文件的類的行爲。

0

經驗豐富的程序員使用任何解決他們的問題,並避免任何產生新問題。

因此,他們避免標頭文件級使用指令的原因很明顯。

他們儘量避免在源文件中對名稱進行全面限定。 小問題是,如果沒有足夠的理由,編寫更少的代碼就不夠優雅。重點是關閉ADL。

這是什麼很好的理由?有時你明確要關閉ADL。有時候你想消除歧義。因此,以下幾點都可以:1)函數實現中的函數級使用指令和使用聲明; 2)源文件中的源文件級使用聲明; 3)(有時)源文件級使用指令。

相關問題