差评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;弊端的一点很小的体现,不过麻雀虽小,五脏俱全。仅此来纪录一下自己犯过的错。
    欢迎大家指正错误
    此文原创,转载请注明源地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值