有时会在源码中或在写代码时在宏定义中用到do...while(0).

采用这种方式进行宏定义, 主要是为了防止出现以下错误 :

do{}while(0)

  1. 空的宏定义避免出现warnning.

    #define foo() do{}while(0)
  2. 存在一个独立的操作, 可以进行变量定义, 进行比较复杂的实现.

  3. 若果出现在判断语句过后的宏, 这样可以作为一个整体来实现.

    #define foo(x)	\
    action1(); \
    action2();

    在以下情况中就会出错 :

    if (NULL == pointer)
    foo(); //在这种情况下就会出现 action1, action2不会被同时执行的情况。

使用do{}while(0)原因

以上三种情况均可以用{}, 实现,但为什么一定要用do{}while(0).

比如 :

#define switch(x,y) {int tmp; tmp =x; x = y; y = tmp;}
if (x > y)
switch(x,y);
else //出现编译错误,宏引入代码后多一个分号
otherAction();

将宏用do{}while(0)将宏包裹起来使其成为一个独立的语法单元, 从而不会与上下文发生混淆, 同时大部分编译器能够识别 do{}while(0) 这种无用的循环, 并对其进行优化, 所以使用这种方法不会导致性能的降低.

最新文章

  1. linux udev 自动挂载 SD卡/U盘
  2. Adb工具配置和设备连接
  3. 洛谷P3392 涂国旗
  4. OC中的面向对象语法3
  5. Pycharm使用问题# 行号设置
  6. Android adb shell命令大全
  7. appserv在哪修改服务器名
  8. C++时间获取
  9. java 文件操作 读取字节级数据(读取)
  10. 应用控制台应用程序开发批量导入EXEL程序。
  11. numpy教程:快速傅里叶变换模块numpy.fft
  12. Windows Server 2008系统
  13. python查询mysql并生成excel表
  14. Apollo配置中心
  15. mysql的部署
  16. Log4j Append属性指定是否追加内容
  17. es-07-head插件-ik分词器插件
  18. java去除数组中重复的元素方法总结
  19. 【BZOJ1054】移动玩具(搜索)
  20. Mac OSX系统下通过ProxyChains-NG实现终端下的代理

热门文章

  1. LeetCode 249. Group Shifted Strings (群组移位字符串)$
  2. JavaScript Patterns 2.6 switch Pattern
  3. ubuntu下使用crontab定时器
  4. js如何获取某id的子标签
  5. bzoj 3993 星际战争
  6. Complicated Expressions(表达式转换)
  7. phpci发送邮件
  8. [App Store Connect帮助]三、管理 App 和版本(2.3)输入 App 信息:提供自定许可协议
  9. php微信开放平台--第三方网页微信扫码登录(OAuth2.0)
  10. Scaffold-DbContext-EFCore DB First