1. 程式人生 > >差評using namespace std;

差評using namespace std;

  • 記得以前剛開始學習c++的時候,總是習慣性的把需要的標頭檔案#include完,然後很自然的來一句using namespace std;
  • 當然,有另外的兩種方法完全可以取代這個using namespace std;而且在很多的情況下都要好一點
  • 方法1:用具體的using來取代,比如using std::cout;只要把需要的給using就可以了
  • 方法2:在程式碼中使用std::cout,每次需要的時候都是這個格式
  • 方法3:採用using namespace std;這裡還是列舉一下。
  • 下面對這三個進行簡單分析:
  • 方法1幾乎在所有的情況下是最佳的選擇,當然前提在編碼之前就知道需要用到哪些,這也是高手的所體現的吧,可惜我不是;方法2相對來說就比較差了,並不是說不可以,這個可以完全正確的,但是唯一存在的問題就是每次需要的時候都要std::一下,當然不如採用一個using std::就可以避免多次的重寫(就好比要寫成函式是差不多的,都是為了方便),當然方法2也有必須用的時候,比如有一個namespace std有一個cout,然而自己定義namespace mynamespace下也有一個cout,這個時候當然就需要具體使用的時候採用具體的cout,std::cout或mynamespace::std,如果是其他方法就會出錯;
  • 然而,方法3受很多初學者的青睞正是因為它帶來的便利,只要一句using namespace std;就可以解決一切問題,比第一種還好無數倍。其實不然,要具體說就要涉及到namespace的引入,實際上namespace的引入正是因為並不是所有的名稱都只有一個含義,所以如果這樣一概而論的包含全部,雖然標準庫裡面設計可能不出現什麼問題,但是如果是牽扯到其他庫的話就不一定了,舉一個自己剛剛經歷的一個例子(剛好也是寫下這篇部落格記錄的原因)
  • 程式碼如下所示
#include <iostream>
using namespace std;


#include <winsock2.h>
#include <stdio.h> #pragma comment (lib, "ws2_32.lib") int main(int argc, char** argv) { WSADATA wsaData; SOCKET sockServer; sockaddr_in addrServer; SOCKET sockClient; SOCKADDR_IN addrClient; WSAStartup(MAKEWORD(2, 2), &wsaData); sockServer = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); addrServer.sin_family = PF_INET; addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"
); addrServer.sin_port = htons(9999); bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); listen(sockServer, 5); int nSize = sizeof(SOCKADDR); printf( "wait for connect of client"); sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &nSize); //cout << "Connected and send msg to client" << endl; send(sockClient, "come form server\n", strlen("come form server\n") + sizeof(char), NULL); closesocket(sockClient); closesocket(sockServer); WSACleanup(); return 0; }
  • 然而執行結果居然是這樣的:
    這裡寫圖片描述
  • 理論上執行的時候不應該馬上結束,而是應該等待,因為accept是阻塞的函式,還好我有一個正確的版本,於是就慢慢去一個地方一個地方的修改,最終終於找出這個問題了——using namespace std;的錯啊,因為我查看了using namespace std;之後的bind()函式居然是呼叫functional標頭檔案裡面宣告的函式,這不是socket應該有的函式啊 ,所以就算是找出這個問題了吧。在這裡其實要說一下之前也注意到bind()有模板引數而且還有65個過載,但是當時沒有注意,所以才會浪費很多時間了。
  • 最後把問題找出來了,然後開始深深痛恨using namespace std;所以給一個差評,以後自己寫程式碼的時候爭取採用第一或者第二種方式,推薦第一種,必要時候第二種方式。
  • 當然這裡只是using namespace std;弊端的一點很小的體現,不過麻雀雖小,五臟俱全。僅此來紀錄一下自己犯過的錯。
    歡迎大家指正錯誤
    此文原創,轉載請註明源地址。