為什麼盡量不要使用using namespace std?

時間 2021-05-08 16:45:25

1樓:東北小蟹蟹

因為這樣的話容易造成全域性命名空間汙染。如果你定義的乙個東西和std中的乙個變數,函式同名,那麼使用using namespace std可能就會撞車。

std::雖然可能麻煩一點吧,但是不會造成命名空間汙染了。

2樓:Z-HE

不要在.h中用。在.cpp中可以用,不要過於吹毛求疵。過於吹毛求疵的結果是,精力都花在搞框架上了,業務沒有推進多少。然後幾個月後業務一變,你這個框架也就沒用了。

3樓:毛兔子和青蛙

一般來說,不是寫專案的話,很少會造成名字衝突。這樣的話,隨手加上using namespace就好。

寫專案的話,還是乖一點吧,把常用的輸入輸出using一下,其他的寫一寫也不會多掉多少頭髮。

4樓:喬捷

那些說不要using namespace的,都是莫名其妙的,完全沒有理解namespace的設計初衷吧。

在沒有namespace的時代,如果A模組有個全域性名字foo,B模組也有乙個全域性名字foo,那麼你是沒法同時引用和鏈結這2個模組的,因為名字衝突了,一旦發生衝突,基本無解。這種情況下逼得你必須把名字起的足夠長來避免發生衝突,比如在名字前加上模組字首A_foo,B_foo,這樣。所以通常c庫的API會用長長的型別名和方法名來命名。

有了namespace,A和B的foo就能和平共處了,但是每次引用模組裡的名字時都要加上A::, B::這樣的名字空間,這和宣告成A_foo有啥區別呢?

還多了個字元,簡直就是多此一舉浪費乙個關鍵字嘛。所以才會有了using namespace的設計。

那如果我們同時using了A和B,foo不是還會衝突嗎?不用擔心,只要在編譯器報告名字衝突的地方,使用全名A::foo,或者用typedef A::

foo A_foo,給名字起個別名,問題就很容易的解決了,相比沒有namespace發生衝突後無解的尷尬局面要好太多了。這就好比外中國人在日常稱呼中都只用人名或者姓(一般用姓關係親密的用名),如果碰上同名的人,那麼再稱呼全名來區分下。通常來說名字衝突是小概率事件,也不用擔心需要在專案中到處解決衝突。

最後,說說using的時機。有些人嚴格限制不允許在標頭檔案裡using namespace,對於一些大型工程或者歷史遺留工程來說,這類的規定有一定的道理,避免給別人造成麻煩的心理值得尊敬。但是過度教條化極端化的理解這條規則,出現了永遠不要using namespace或者只在極小的作用域裡比如函式體內using,這就完全因噎廢食,矯枉過正了。

對於using的時機,我持開放的態度,如果有專案規範具體規定的,遵循規範來做。沒有的話,我更傾向於在include之後直接using namespace。

5樓:流石Lee

在沒有很好的開發工具輔助你的情況下,如果出現了命名上的相近乃至相同,會很難分清到底呼叫了哪個。出了問題查起來頭疼,沒出問題也可能只是剛剛好。。。

6樓:avoidant

自己乙個人程式設計序,或者當老大別人都得順著你,而且也不用第三方庫的話,把using name std寫標頭檔案裡非常爽。

否則的話,比較麻煩,本來為省事去了。

7樓:

你得先知道這個玩意兒是幹嘛的,命名空間主要是防止命名衝突的,std是標準庫的命名空間,如果使用了using namespace std那不就把整個標準庫的東東全部暴露出來了,你寫個小專案測試的或者小工具可能還好,你專案一變大你會有一定概率和標準庫名字重名衝突的,會出現莫名的問題,以上。

8樓:

因為namespace就是給你乙個限定名字域的作用的,你using之後相當於沒有。那人家設計的時候就沒考慮重名,你using之後重名的概率很大。既然要有namespace,在cpp檔案可控的時使用或者函式內用還可以看做是偷懶,在到處包含的標頭檔案或者靠前的全域性作用域裡用,那就是脫褲子放屁。

等你用了報一大堆不知所以的錯,找半天找不出來就知道為什麼了。

9樓:

這就跟python裡你寫

from numpy import *

from pandas import *

from tensorflow import *一樣的。很容易就有衝突的。。。

10樓:Sata

其實我不是很明白為什麼盡量不要使用,說是為了避免名字衝突,可是,我從來都沒遇到過……

(可能是我函式或者變數的命名都是用拼音打的吧……(譬如快速排序,別人寫qsort,我寫kuaisupaixu……))

11樓:

其實並不是盡量不要使用using namespace std,而是盡量少用using namespace。

因為C++命名空間最主要的作用就在於將變數放入命名空間中以防止重名,而using namespace以後,該命名空間下的所有識別符號都不需要加上前提的命名空間標識便可直接使用,這樣一來會使命名空間的意義失效,從而發生難以預見的混亂和bug。

12樓:

前排同學們都講得挺詳細了,渣渣前來試圖補充。

自己沒有參與過很大的專案開發,所以對這個語句沒什麼意識;看到首贊 @zhang.jingjing 的回答,大概了解是什麼原因;看到輪子哥的答案,又覺得確實沒有必要對自己那麼絕。

想想還是上stackoverflow上查了下,大概情況差不多,但是關於此程式設計習慣的危害有乙個暫時想不到什麼其他解決方法的,大家可以看下哈~

問題下 sbi 的回答中提到:

I agree with everything Greg wrote, but I'd like to add:It can even get worsethan Greg said!

Library Foo 2.0 could introduce a function, Quux(), which is anunambiguously better matchfor some of your calls to Quux() than the bar::Quux() your code called for years.

Then your code still compiles, but it silently calls the wrong function and does god-knows-what.

C++的選擇呼叫哪個函式時是看哪個最適合,也就是說,你可能不知不覺中就把你原有的函式給過載了,編譯器也不會報錯,這樣的話跟我們本意可能就不同啦。

BTW,命名空間和類要好好用,可以防止此類過載/命名衝突問題:)

所以嘛,具體怎麼處理,只好自己衡量了,偷懶當然好。萬一出現坑了,就乖乖背鍋填坑就好了哈哈哈

13樓:

只是千萬不要在標頭檔案裡面using而已。

主要是命名衝突,而且衝突以後,編譯器給的錯誤資訊基本是妖魔,牛頭不對馬嘴,難以追查。有些根本編譯就沒錯誤和警告,但是就是執行錯誤。

跟萌心們解釋這些很麻煩,而且效果也不是很好,所以一般直接硬性規定標頭檔案不准出現任何乙個using

14樓:

不要這麼做,按下面的例子來做:

void foo()

15樓:徐辰

別在標頭檔案裡using namespace就行了,在cpp裡,尤其是不太長的那種,using namespace std沒什麼問題。

16樓:薄荷

這個問題的重點並不是在 std,而是using namespace。

設想一下你有兩個 spaces

using

namespace

foo;

using

namespace

bar;

當你呼叫

foo::

func_1

();bar

::func_2

();都可以直接使用

func_1

();func_2

();這沒有問題。但是當有一天你的foo裡面增加了乙個新的方程,你的foo_v2

::func_2

();出現了。那麼如果你是用 namespace的話,則會產生問題。

C++ 的ADL不知道你需要 bar裡的func_2還是foo_v2裡面的func_2。

所以為了方便和保險起見,不要使用using namespace在大工程裡面。

17樓:

除了stl和boost兩個玩具,幾乎所有的第三方庫都是c形式的介面,而boost基本沒人用,11之前人們寧可手動釋放也不去引入boost的智慧型指標。

所以這個問題問的是為什麼不能用using namespace std而不是為什麼不能用using namespace,儘管命名汙染的原理是一樣的。

是不是很搞笑?

18樓:工廠方法

LLVM style: LLVM Coding Standards

"Do Not Use using namespace std"

19樓:

提乙個專案樹的概念,例如一些庫檔案,他應該處於專案樹的最低端或者處於專案樹的葉子節點上。而入口函式所處的檔案稱之為專案樹的根(大體就是main函式了),使用

using

namespace

std;

這樣的語句盡量不要遠離專案樹的根。

對了,盡量不要在標頭檔案中使用using namespace std;

可以在cpp中使用這句,但是最好不要引起名稱衝突咯。

描述錯誤請輕拍,本人對c++一竅不通。

20樓:魯哈花

少在標頭檔案中使用using namespace std,因為你的標頭檔案可能被別人的cpp包含,那麼這些cpp也預設就using namespace std了。這樣的話可能會造成問題,例如在c++11和boost中都有shared_ptr,不指定namaspace或者using了兩個namespace可能會造成混淆問題。

為什麼要使用MCMC方法?

微塵 黃含馳 摘自https www.17講02 近似推斷法 MCMC和變分推斷 簡而言之,你這裡問的是求積分的問題。MCMC有兩部分,前半部分是馬爾科夫鏈 Markov Chain 用來生成服從後驗分布的樣本,知道分布並不總能得到樣本,除了那些比較簡單的分布,例如簡單的均勻分布 後半部分是蒙特卡洛...

我們為什麼要使用 Kafka

我看到這些文字就像看到了自己,我的情況和你差不多,剛畢業時一直想考研,既然已經入了體制內畢竟家裡是不讓辭職的。於是想讀在職的,一看學費我放棄了,那天我痛哭了一場,看著身邊好多朋友和親戚家裡有錢但是卻都不願讀書只知道玩樂花錢,而我想讀書卻沒有錢,工資除去租房和自己生活其他補貼家裡使用。畢業很多年一直租...

iPhonese為什麼要使用a13?

Laitoeuf 有iPhone5c採用上一代A6晶元銷量不振的先例在,以後出的每一款iPhone無論高階低端都是採用當時最新的晶元。參考iPhone6s iPhone SE一代 iPhone XS iPhone XR iPhone11 iPhone 11 Pro iPhone SE 二代。只不過低...