为什么在WinSock2.h(c ++)中将无效套接字定义为〜0?

unj*_*nj2 19 c++ sockets network-programming

在WinSock2.h中,无效的套接字和套接字错误被定义为这些?这有什么意义吗?

#define INVALID_SOCKET  (SOCKET)(~0)
#define SOCKET_ERROR            (-1)
Run Code Online (Sandbox Code Playgroud)

jxh*_*jxh 31

很久以前,在一个寒冷的阴雨天的上午,在蒙蒙的绿色覆盖的丘陵在西雅图,华盛顿州的一个古朴,但越来越多的郊区之中初,出现了的红砖建筑一个小而庞大的产业集群,其中之一是一个中等规模的会议室,越来越多的网络软件工程师,经理和建筑师聚集在一起.这次会议已经开始悄然足够,与男性居多组喝的茶叶和咖啡的杯子,捻转他们的自动铅笔,而在他们的便签涂鸦,或刮掉自己的掌上电脑(有与牛顿的家伙,但大家忽略他).

随着演示者继续浏览源代码,他被5位软件架构师中的一位拦截,这些架构师特别没有被邀请参加评审,但无论如何都出现了."祈祷告诉我,是什么."他说,像克林顿总统一样摇着他的手指.演示者停下来,盯着手指,发现自己被手指的摆动迷住了,因为建筑师继续摇摆."我说,"他开始重复道.

主持人抬头看着屏幕,没有注意到任何不对劲."你在说什么?" 他问.

建筑师抬起眉毛,因为他的脸首先表示惊愕,然后转向愤怒,然后便秘,因为他大喊" 是一种明显的编码风格指导违规行为!".

观察者们开始互相窃窃私语,想知道问题究竟是什么.但是,主持人不知所措(第二种),很快就感谢您的反馈,并继续审查.

"我不会被忽视!",当他突然站起来时,建筑师尖叫着尖叫着,用一种懦弱的砰砰声将他的手掌猛地撞到桌面上.

当拳头敲打桌子时,房间爆发了,经理们开始设计掩盖背后的方法,工程师们开始翻阅他们的编码风格手册,包括目录,索引,脚注和参考文献.

主持人在外面没有受到干扰,但感到恼火,因为他非常想要完成审查,以便他可以继续他在斯诺夸尔米的滑雪之旅."你在谈论类型不匹配吗?",他随口问道.

建筑师看了一会儿看起来很吃惊,但很快又重新组合了自己,"显然",他哼了一声.

主持人用'~0'替换了两个字符'-1'并转过身来.建筑师仔细检查了变化,然后是屏幕的其余部分,然后咨询了他的笔记,然后终于坐下来了.

其余的评论平安无事.


Ste*_*sop 19

在二进制补码系统(和Windows总是两个补码),~0等于-1,所以对编译器没有意义.

读者可能有一个重要的意义:~0强调它是一个设置了所有位的值,而-1强调它是一个小于0的值.

在旁边:

在一个不是二进制补码的系统上,假设它SOCKET是一个无符号类型,写入通常是错误的(SOCKET)(~0).原因是在这样的系统上,~0不表示值-1,它是INT_MIN负零或陷阱表示之一.因此,它并不一定会转换成键入SOCKET与所有位的值为零,而它会转换INT_MAX+2,0或善良知道的什么(也许所有位值设置).

所以通常你应该初始化无符号类型,-1以获得所有位设置的值.如果你知道你正在处理哪种无符号类型,你可以使用UINT_MAX,或~0UL类似.但它不值得,因为-1适用于所有无符号类型.