do{}while(0)的疑惑

darkay 2001-04-27 05:53:00
我在看winsock2.h这个文件的事后发现这样一个宏定义:
#define FD_CLR(fd, set) do { u_int __i; for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count ; __i++) { if (((fd_set FAR *)(set))->fd_array[__i] == fd) { while (__i < ((fd_set FAR *)(set))->fd_count-1) { ((fd_set FAR *)(set))->fd_array[__i] = ((fd_set FAR *)(set))->fd_array[__i+1]; __i++; } ((fd_set FAR *)(set))->fd_count--; break; } } } while(0)
我不明白的是为什么要用do{}while(0);这样的结构,很显然这样的写法,结构里面的东西只运行一次,为了达到这个目的,不加这个结构也可以实现的啊;我在想是不是由于想要兼容c语言(不能在中间定义局部变量)关系,但是我想,为了使用一个局部变量(c语言中)只要加一对{}就可以在中间使用局部变量啊!实在是想不明白,请高手指点。
...全文
51 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
westbuilding 2001-07-21
  • 打赏
  • 举报
回复
结束它
darkay 2001-04-28
  • 打赏
  • 举报
回复
to:repus()
我不知道发出来的时候排版怎么变成那样的拉,你有没有仔细看看源文件(VC有源文件)。那个break不是打断do{}while(0)结构用的,它是打断for语句的。
我把这个宏解析一下吧:参数set使一个SOCKET的集合,fd是一个SOCKET变量,这个宏的作用是如果set中包含fd的话,将fd从set中删除。他的做法是:用一个for循环查找fd的位置,然后用一个while循环将fd后面的元素往前挪动一个位置,然后break;看到那个break的用处了吧,它仅仅是打断开始的那个for循环用的(因为已经没有必要再循环下去了),如果for后面还有语句的话,它还是要执行它的(就像同一个文件里面另一个宏FD_SET的样子)
repus 2001-04-27
  • 打赏
  • 举报
回复
C语言没有异常处理,而使用goto太“难看”,do{}while(0)加上break可以实现goto的效果

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧