7 回答

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
這根本與性能無關(guān)。但請考慮一下:您正在使用兩個(gè)名為Foo和Bar的庫:
using namespace foo;using namespace bar;
一切正常,你可以毫無問題地Blah()
從Foo和Quux()
Bar 打電話。但有一天你升級到新版本的Foo 2.0,它現(xiàn)在提供了一個(gè)名為的功能Quux()
。現(xiàn)在你遇到了沖突:Foo 2.0和Bar都導(dǎo)入Quux()
了你的全局命名空間。這將需要一些努力來修復(fù),特別是如果函數(shù)參數(shù)碰巧匹配。
如果你使用過foo::Blah()
和bar::Quux()
,然后引進(jìn)的foo::Quux()
將是一個(gè)非事件。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
Library Foo 2.0可以引入一個(gè)函數(shù),Quux()
這對于你的一些調(diào)用來說Quux()
比bar::Quux()
你多年來調(diào)用的代碼更明確地匹配。然后你的代碼仍然編譯,但它默默地調(diào)用錯(cuò)誤的函數(shù),并且知道神知道什么。這和事情一樣糟糕。
請記住,在std
命名空間有萬噸標(biāo)識符,其中許多都是很常見的(想想list
,sort
,string
,iterator
,等),這是非常有可能出現(xiàn)在其他的代碼了。
如果你認(rèn)為這不太可能:在我給出這個(gè)答案大約半年之后,在Stack Overflow上有一個(gè)問題,其中幾乎發(fā)生了這種情況(錯(cuò)誤的函數(shù)被稱為由于省略了std::
前綴)。這是另一個(gè)最近這樣一個(gè)問題的例子。所以這是一個(gè)真正的問題。
這里還有一個(gè)數(shù)據(jù)點(diǎn):很多年前,我也常常發(fā)現(xiàn)它必須為標(biāo)準(zhǔn)庫中的所有內(nèi)容添加前綴std::
。然后我在一個(gè)項(xiàng)目中工作,在開始時(shí)決定using
禁止指令和聲明,除了函數(shù)范圍。你猜怎么著?我們大部分時(shí)間都花了很長時(shí)間才習(xí)慣編寫前綴,經(jīng)過幾周后,我們大多數(shù)人甚至同意它實(shí)際上使代碼更具可讀性。這是有原因的:你喜歡更短或更長的散文是主觀的,但前綴客觀上增加了代碼的清晰度。不僅是編譯器,而且您也更容易看到引用哪個(gè)標(biāo)識符。
十年來,該項(xiàng)目增長了數(shù)百萬行代碼。由于這些討論一次又一次地出現(xiàn),我曾經(jīng)很好奇這個(gè)(允許的)功能范圍using
實(shí)際上在項(xiàng)目中的使用頻率。我找了它的來源,只發(fā)現(xiàn)了一兩個(gè)地方使用它。對我而言,這表明,一旦嘗試過,開發(fā)人員std::
即使在允許使用指令的情況下,即使每100kLoC使用指令也不會發(fā)現(xiàn)痛苦。
底線:明確地為所有內(nèi)容添加前綴不會造成任何傷害,很少習(xí)慣,并具有客觀優(yōu)勢。特別是,它使編碼器和人類讀者更容易理解代碼 - 這應(yīng)該是編寫代碼時(shí)的主要目標(biāo)。

TA貢獻(xiàn)1843條經(jīng)驗(yàn) 獲得超7個(gè)贊
放入using namespace
類的頭文件的問題在于它強(qiáng)制任何想要使用您的類(通過包含頭文件)的人也可以“使用”(即看到所有內(nèi)容)這些其他命名空間。
但是,您可以隨意在(私有)* .cpp文件中放置using語句。
請注意,有些人不同意我這樣的說法“感覺自由” - 因?yàn)殡m然cpp文件中的using語句比標(biāo)題中的更好(因?yàn)樗粫绊懓^文件的人),但他們認(rèn)為它仍然存在沒有良好的(因?yàn)檫@取決于它的代碼可以使課堂更加難以維持的實(shí)現(xiàn))。這個(gè)FAQ主題說,
using-directive存在于遺留C ++代碼中,并且可以簡化向命名空間的轉(zhuǎn)換,但您可能不應(yīng)該定期使用它,至少不能在新的C ++代碼中使用它。
FAQ提出兩種選擇:
使用聲明:
using std::cout; // a using-declaration lets you use cout without qualificationcout << "Values:";
只需輸入std ::
std::cout << "Values:";

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊
不應(yīng)該在全局范圍內(nèi)使用using指令,尤其是在頭文件中。但是,即使在頭文件中也存在適當(dāng)?shù)那闆r:
template <typename FloatType> inlineFloatType compute_something(FloatType x){ using namespace std; //no problem since scope is limited return exp(x) * (sin(x) - cos(x * 2) + sin(x * 3) - cos(x * 4));}
這比顯式限定(std::sin
,std::cos
...)更好,因?yàn)樗滩⑶夷軌蚴褂糜脩舳x的浮點(diǎn)類型(通過Argument Dependent Lookup)。
- 7 回答
- 0 關(guān)注
- 1536 瀏覽
添加回答
舉報(bào)