- 记得以前刚开始学习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);
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;弊端的一点很小的体现,不过麻雀虽小,五脏俱全。仅此来纪录一下自己犯过的错。
欢迎大家指正错误
此文原创,转载请注明源地址。