zoukankan      html  css  js  c++  java
  • 为什么要用do-while(0)?

    今天读代码时候,看到这样的代码。。

    #define MG_SET_PTRPTR(_ptr, _v) 
    do { 
    if (_ptr) *(_ptr) = _v; 
    } while (0)
    

    1、对于带有if 语句的宏,无论是内核还是开源代码,都是用到了do while(0)技巧。问题来了,为什么要这样搞呢?
    很简单,假设存在

    if XXX
    {
    if (_ptr) *(_ptr) = _v;
    }	
    else
    {
    ....
    }
    


    如果这里没有do while,那么是不是后面的else语句匹配出错了呢????
    导致的效果是:编译能通过,但是执行出错。

    2、还会存在一种极度恶心的情况。
    假设存在宏展开后为:

    a = a + 1; b = a;
    

    那么,有: 

    if xxxx
    a = a + 1; b = a;
    else
    XXXX
    

    那么会导致编译通不过。

    所以内核也好,开源软件也好,为了解决宏带来的问题,不得不引入这种do while(0) 这样的代码。。。

  • 相关阅读:
    hibernate映射-单向多对一映射
    CSS
    HTML基础
    复习
    元类,单例
    数据类型,约束,存储引擎
    数据库概念,安装,基本操作
    IO模型
    异步回调,协程
    GIL锁,线程池,同步异步
  • 原文地址:https://www.cnblogs.com/ccXgc/p/9046963.html
Copyright © 2011-2022 走看看