1. 程式人生 > >沒有躲過的坑--使用using namespace std的壞習慣【轉】

沒有躲過的坑--使用using namespace std的壞習慣【轉】

(轉自:https://blog.csdn.net/wangshubo1989/article/details/50061311?utm_source=blogxgwz9

使用名稱空間的目的是對識別符號的名稱進行本地化,以避免命名衝突。

在C++中,變數、函式和類都是大量存在的。如果沒有名稱空間,這些變數、函式、類的名稱將都存在於全域性名稱空間中,會導致很多衝突。比如,如果我們在自己的程式中定義了一個函式toupper(),這將重寫標準庫中的toupper()函 數,這是因為這兩個函式都是位於全域性名稱空間中的。命名衝突還會發生在一個程式中使用兩個或者更多的第三方庫的情況中。此時,很有可能,其中一個庫中的名 稱和另外一個庫中的名稱是相同的,這樣就衝突了。這種情況會經常發生在類的名稱上。比如,我們在自己的程式中定義了一個Stack類,而我們程式中使用的某個庫中也可能定義了一個同名的類,此時名稱就衝突了。

Namespace 關鍵字的出現就是針對這種問題的。由於這種機制對於聲明於其中的名稱都進行了本地化,就使得相同的名稱可以在不同的上下文中使用,而不會引起名稱的衝突。或許名稱空間最大的受益者就是C++中的標準庫了。在命名空間出現之前,整個C++庫都是定義在全域性名稱空間中的(這當然也是唯一的名稱空間)。引入名稱空間後,C++庫就被定義到自己的名稱空間中了,稱之為std。這樣就減少了名稱衝突的可能性。我們也可以在自己的程式中建立自己的名稱空間,這樣可以對我們認為可能導致衝突的名稱進行本地化。這點在我們建立類或者是函式庫的時候是特別重要的。

C++標準程式庫中的所有識別符號都被定義於一個名為std的namespace中。 
namespace是指識別符號的各種可見範圍。名稱空間用關鍵字namespace 來定義。名稱空間是C++的一種機制,用來把單個識別符號下的大量有邏輯聯絡的程式實體組合到一起。此識別符號作為此組群的名字。

C++標準程式庫中的所有識別符號都被定義於一個名為std的namespace中。 由於namespace的概念,使用C++標準程式庫的任何識別符號時, 
可以有三種選擇: 
[1] 直接指定識別符號 
例如std::iostream而不是iostream。完整語句如下:

std::cout<<std::hex<<3.4<<std::endl;


[2]使用using關鍵字

using std::cout; 
using std::endl; 
using std::cin;
cout << hex << 3.4 << endl;


[3]使用using namespace std

#include<iostream>
#include<sstream>
#include<string>
using namespace std;


但是坑兒就再這裡,從我們學習C++開始,很願意寫using namespace std,這樣在實際工程中也許就會有所災難。

看看下面的程式碼:

using namespace foo;
using namespace bar;


一切都有序進行,你可以從Foo中呼叫Blah,可以從Quux呼叫Bar。 
但是有一天,你升級了Foo,在Foo中也聲明瞭一個Quux函式,這樣問題就來了。

也許是別人給你挖的坑兒,也許是你挖了坑在等別人。

所以千萬不要使用using namespace std這樣的語句在實際工程中,不能嫌麻煩,在呼叫的函式的時候,在前面冠以名稱空間。

也許有的人對此感到不屑,但是對於一個優秀的程式設計師好習慣一定是必要的!!!