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
适用于所有无符号类型.