為什麼盡量不要使用using namespace std?
為什麼我看到很多資料都寫著能不用就不用,能在大括弧裡面用就不要在外面用。我剛剛開始學c++所以不太明白
因為使用STL中 有部分名稱是沒有加下劃線的保留標記的
而在自己的源代碼中用到了後會引發未定義的後果例如:#include &
using namespace std;
int main()
{
int max=0;
}
一直我都告誡學習C++的人 以後精通了C++就不要用using namespace std;了
如使用 如using std::cin;效果會更好原例子已刪除:未經證實
例子原文放在最後----update:Jun 18th , 2015
看來論據不夠充分 那我加下
《C++ Primer Plus (第六版 中文版 人民郵電出版社)》第九章:內存模型和名稱空間 第328頁:
"有關using編譯命令和using聲明,需要記住的一點是,他們增加了名稱衝突的可能性。"
《C++ Primer Plus (第六版 中文版 人民郵電出版社)》第九章:內存模型和名稱空間 第329頁:《C++ Primer Plus (第六版 中文版 人民郵電出版社)》附錄I: 轉換為ISO標準的C++ 第915頁:一般說來,使用using命令比使用using編譯命令更安全,這是由於它只導入了制定的名稱。如果該名稱與局部名稱發生衝突,編譯器將發出指示。using編譯命令導入所有的名稱,包括可能並不需要的名稱。如果與局部名稱發生衝突,則局部名稱將覆蓋名稱空間版本,而編譯器並不會發出警告。另外,名稱空間的開放性意味著名稱空間的名稱可能分散在多個地方,這使得難以準確知道添加了哪些名稱。
...然而名稱空間的支持者希望有更多的選擇,既可以使用解析運算符面也可以使用using聲明,也就是說,不要這樣做:
using namespace std; // avoid as too indiscriminate(隨意)
而應這樣做
int x;
std::cin &>&> x ;
std::cout &<&< x &<&< std::endl;或者這樣做
using std::cin;
using std::cout;
using std::endl;
int x;
cin &>&> x;
cout &<&< x &<&< endl;
名稱空間有助於組織程序中使用標識符,避免名稱衝突。由於標準庫是使用性的頭文件組織實現的,它將名稱放在std名稱空間中,因此使用這些頭文件需要處理名稱空間。
出於簡化的目的,本書的事例通常使用編譯命令using來使std名稱空間中名稱可用:
#include &
#include &
#include &
using namespace std; //a using-directive
然而,不管需要於否,都導出名稱空間中的所有名稱,是於名稱空間的初衷背道而馳的。
由此可見 using namespace std; 並不是可以隨意使用的語句。
----update:Jun 18th , 2015 night.
覺得例子還不夠豐富 就上了google看看在Steve Donovan 《C++ by Example》中寫到:而在國外的論壇StackOverflow對於What requires me to declare 「using namespace std;」?Péter T?r?k給出了這樣的解釋However, some people feel strongly that using namespace std cases namespace pollution because everything is dumped into the global namespace, which is what namespaces were designed to prevent. You need to understand the implications of using namespace std, and you need to recognize that there is one case where it always a bad idea.
However,
using namespace std;
is considered a bad practice because you are practically importing the whole standard namespace, thus opening up a lot of possibilities for name clashes. It is better to import only the stuff you are actually using in your code, like
using std::string;
--update: Jan. 14th, 2016 morning
原文已被刪除--update May 20th, 2016 evening
刪除原文:Ubuntu Pastebin轉載請註明出處提一個項目樹的概念,例如 一些庫文件,他應該處於項目樹的最低端或者處於項目樹的葉子節點上。而入口函數所處的文件稱之為項目樹的根(大體就是main函數了),使用
using namespace std;
這樣的語句盡量不要遠離項目樹的根。
對了,盡量不要在頭文件中使用using namespace std;
可以在cpp中使用這句,但是最好不要引起名稱衝突咯。
描述錯誤請輕拍,本人對c++一竅不通。通常來講,一個能平衡潔癖和效率的方法是只在cpp文件裡面using namespace。只要編譯器不抱怨,你就寫using namespace std;。直到有一個名字衝突了,再用一些詭異的方法來解決。不然要用什麼都寫一大串using std::cout,那算上其他庫,加上什麼IO啊、GUI啊、各種亂七八糟的,你得寫幾萬行using,不要活了。
我不相信有人在寫一個實用的企業程序的時候,能夠堅持不using namespace。而且那些喜歡搞極端主義的人,其實他們的做法還可以再極端——名字都用::開頭,完美保證不會被覆蓋。你得std::cout寫在了大括弧裡面,保不準也是fuck::shit::std::cout啊。::std::cout歡迎你(逃就是怕名字衝突嘛。可是,你寫的什麼代碼,能和系統庫衝突?
不要在頭文件里用,你不知道這個using能覆蓋到多大範圍。
在cpp文件,所有include之後用,沒什麼問題。(不要在任何include之前用,那和放在頭文件里沒區別)我知道有的團隊不讓這麼用,我覺得有矯枉過正(中性詞)的意味。與其跟新手解釋這個不行,那個行,可那個這麼一下又不行了,還不如就別用了。簡單、直接、效果好。就是引誘有一堆自以為很牛逼的人,愛寫
max min swap move forward
這樣的「單謂詞」函數名。很容易,這些牛逼的命名和std名字空間有衝突。
推薦咱們自己的函數(不是類的成員函數)命名,最好使用謂語+賓語規則。如果怕和std有衝突,要麼是謂語和賓語加分隔符,要麼定義大寫命名規範。只是千萬不要在頭文件裡面using而已。
主要是命名衝突,而且衝突以後,編譯器給的錯誤信息基本是妖魔,牛頭不對馬嘴,難以追查。有些根本編譯就沒錯誤和警告,但是就是運行錯誤。
跟萌心們解釋這些很麻煩,而且效果也不是很好,所以一般直接硬性規定頭文件不準出現任何一個using少在頭文件中使用using namespace std,因為你的頭文件可能被別人的cpp包含,那麼這些cpp也默認就using namespace std了。這樣的話可能會造成問題,例如在c++11和boost中都有shared_ptr,不指定namaspace或者using了兩個namespace可能會造成混淆問題。
這麼說是沒錯,不過除非歷史代碼,否則能和std衝突的命名,還是拖出去斃了吧。
別在頭文件里using namespace就行了,在cpp里,尤其是不太長的那種,using namespace std沒什麼問題。
這玩意只有吃到虧才會知道痛。
裝逼必備.
聽這些人吹.人要有腦子.防止名字空間污染。頭文件中盡量不要使用,實現文件中可以酌情使用。
直接using會把整個空間里的東西全部引入,這樣做的優點是省事,缺點是如果你自己有同名的,很容易造成衝突。
根據優缺點,自己選擇。
我的做法是,測試例子,無所謂,喜歡怎樣就怎樣。但項目工程,能不using就盡量不using,接著在代碼里寫全稱。LLVM style: LLVM Coding Standards
"Do Not Use using namespace std"
贊同輪子哥的觀點。
我再補充一點,很多人說不要在頭文件中 using namespace std,那麼頭文件中豈不是滿篇的 std::string,std::vector 了?
我的慣常做法是,把 using namespace std 放到我的命名空間中,比如:
// fuck.h
#include &
namespace fuck {
using namespace std;
void Fuck(string shit);
}
這樣你只是污染了你的 fuck 命名空間,而因為這是你的命名空間,所以不會影響使用者。
#include "fuck.h"
fuck::Fuck("shit");
而且不是說你用了 using namespace std,就被 std 中所有名字污染了。你還得包含相應的頭文件的。比如你只 #include &
編程已經很辛苦了,為了那種迂腐保守的老套「規則」,浪費時間和可讀性,一點都不值得。怎麼爽怎麼來,前提是你得知道影響範圍和解決辦法。
只需要用一棵樹,你卻砍伐了整個森林
一個工程中幾十個文件中n重包含突然出現命名衝突,找起來累死你
尤其是在寫sdk的時候,依賴其它庫,又要避免在被引用處名字衝突/鏈接歧義。so上有這個問題討論。
不要這麼做,按下面的例子來做:void foo(){ using namespace std; string bar = "bar";}
std::move 還有自定義的swap 和std::swap ,有蠻多技巧
推薦閱讀:
※如何delete數組?
※c/cpp 中從源代碼到可執行文件的過程,鏈接是必須的嗎?
※c++中有現成的string hash函數么?
※大家能談談是怎麼學習windbg的嗎?
※同一個指針,作為父類類型被delete,但作為子類類型仍能訪問成員變數,為什麼?