亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么“使用命名空間std”被認為是不好的做法?

為什么“使用命名空間std”被認為是不好的做法?

料青山看我應如是 2019-05-20 15:45:32
我已經告訴別人,編寫using namespace std代碼是錯誤的,我應該用std::cout和std::cin直接代替。為什么被using namespace std認為是不好的做法?是低效還是冒著聲明模糊變量(與名稱std空間中的函數具有相同名稱的變量)的風險?它會影響性能嗎?
查看完整描述

7 回答

?
MM們

TA貢獻1886條經驗 獲得超2個贊

這根本與性能無關。但請考慮一下:您正在使用兩個名為Foo和Bar的庫:

using namespace foo;using namespace bar;

一切正常,你可以毫無問題地Blah()從Foo和Quux()Bar 打電話。但有一天你升級到新版本的Foo 2.0,它現在提供了一個名為的功能Quux()?,F在你遇到了沖突:Foo 2.0和Bar都導入Quux()了你的全局命名空間。這將需要一些努力來修復,特別是如果函數參數碰巧匹配。

如果你使用過foo::Blah()bar::Quux(),然后引進的foo::Quux()將是一個非事件。


查看完整回答
反對 回復 2019-05-20
?
吃雞游戲

TA貢獻1829條經驗 獲得超7個贊

Library Foo 2.0可以引入一個函數,Quux()這對于你的一些調用來說Quux()bar::Quux()你多年來調用的代碼更明確地匹配。然后你的代碼仍然編譯,但它默默地調用錯誤的函數,并且知道神知道什么。這和事情一樣糟糕。

請記住,在std命名空間有萬噸標識符,其中許多都是常見的(想想list,sort,string,iterator,等),這是非常有可能出現在其他的代碼了。

如果你認為這不太可能:在我給出這個答案大約半年之后,在Stack Overflow上有一個問題,其中幾乎發生了這種情況(錯誤的函數被稱為由于省略了std::前綴)。是另一個最近這樣一個問題的例子。所以這是一個真正的問題。


這里還有一個數據點:很多年前,我也常常發現它必須為標準庫中的所有內容添加前綴std::。然后我在一個項目中工作,在開始時決定using禁止指令和聲明,除了函數范圍。你猜怎么著?我們大部分時間都花了很長時間才習慣編寫前綴,經過幾周后,我們大多數人甚至同意它實際上使代碼更具可讀性。這是有原因的:你喜歡更短或更長的散文是主觀的,但前綴客觀上增加了代碼的清晰度。不僅是編譯器,而且您也更容易看到引用哪個標識符。

十年來,該項目增長了數百萬行代碼。由于這些討論一次又一次地出現,我曾經很好奇這個(允許的)功能范圍using實際上在項目中的使用頻率。我找了它的來源,只發現了一兩個地方使用它。對我而言,這表明,一旦嘗試過,開發人員std::即使在允許使用指令的情況下,即使每100kLoC使用指令也不會發現痛苦。


底線:明確地為所有內容添加前綴不會造成任何傷害,很少習慣,并具有客觀優勢。特別是,它使編碼器和人類讀者更容易理解代碼 - 這應該是編寫代碼時的主要目標。


查看完整回答
反對 回復 2019-05-20
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

放入using namespace類的頭文件的問題在于它強制任何想要使用您的類(通過包含頭文件)的人也可以“使用”(即看到所有內容)這些其他命名空間。

但是,您可以隨意在(私有)* .cpp文件中放置using語句。


請注意,有些人不同意我這樣的說法“感覺自由” - 因為雖然cpp文件中的using語句比標題中的更好(因為它不會影響包含頭文件的人),但他們認為它仍然存在沒有良好的(因為這取決于它的代碼可以使課堂更加難以維持的實現)。這個FAQ主題說,

using-directive存在于遺留C ++代碼中,并且可以簡化向命名空間的轉換,但您可能不應該定期使用它,至少不能在新的C ++代碼中使用它。

FAQ提出兩種選擇:

  • 使用聲明:

    using std::cout; // a using-declaration lets you use cout without qualificationcout << "Values:";
  • 只需輸入std ::

    std::cout << "Values:";


查看完整回答
反對 回復 2019-05-20
?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

不應該在全局范圍內使用using指令,尤其是在頭文件中。但是,即使在頭文件中也存在適當的情況:

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...)更好,因為它更短并且能夠使用用戶定義的浮點類型(通過Argument Dependent Lookup)。


查看完整回答
反對 回復 2019-05-20
  • 7 回答
  • 0 關注
  • 1547 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號