zoukankan      html  css  js  c++  java
  • #define XXX do{ XXX } while(0) 为什么使用

    #define XXX do{ XXX } while(0) 为什么使用


    时常会遇到一个非常"奇怪的宏定义", rt.(欧西巴...思考不够深刻啊, 皮鞭, 啪啪啪)


    近期又遇到这家伙了,Quora上面Love神回答了这个问题, 我也就顶礼膜拜

    http://www.quora.com/What-is-the-purpose-of-using-do-while-0-in-macros


    这是C语言里面宏定义的时候,不会造成歧义或副作用的一种经常使用技巧.


    考虑一下情况

    #define foo(x)  bar(x); baz(x)


    foo(wolf);


    常规的,扩展成例如以下代码:

    bar(wolf); baz(wolf);


    这都还好,没啥问题.可是假设遇到if推断语句了,看看以下的样例.

    f (!feral)
        foo(wolf);


    这就扩展成了以下的形式,(⊙o⊙)看,是不是出现了你不想要粗线的情况捏?

    这里if语句仅仅能作用于第一个bar()函数,无法作用于第二个baz().可是这样的方式非常可能不是程序猿的本意.

    本意就是把foo单做一个总体嘛~


    if (!feral)
        bar(wolf); baz(wolf);
    



    等价于例如以下形式
    if (!feral)
        bar(wolf);
    baz(wolf);
    



    离开了 do/while(0)你就别想把宏定义玩的跟函数一样一样的~

    假设使用这样的技巧定义宏定义, 

    #define foo(x)  do { bar(x); baz(x); } while (0)


    还是这个宏定义,这么用
    f (!feral)
        foo(wolf);
    


    就变成了例如以下形式.

    if (!feral)
        do { bar(wolf); baz(wolf); } while (0);
    

    等价于
    if (!feral) {
        bar(wolf);
        baz(wolf);
    }
    



    你可能会想,用以下这样的方式,加个{}不就解决这个问题了么?干嘛害的要do{} while(0)?
    考虑例如以下情况
    #define foo(x)  { bar(x); baz(x); }


    if (!feral)
        foo(wolf);
    else
        bin(wolf);
    


    这就变成了
    if (!feral) {
        bar(wolf);
        baz(wolf);
    };
    else
        bin(wolf);
    



    注意!这里使得else变成了"臭名昭著的"dangling else.







    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    洛谷P4547 [THUWC2017]随机二分图
    洛谷P4590 [TJOI2018]游园会
    洛谷P4099 [HEOI2013]SAO
    #4719. 内凸包
    #1612. 天平(scales)
    #3164. 「CEOI2019」立方填词
    #4728. 问题求解
    #2754. Count(count)
    sa模板
    bzoj 2553: [BeiJing2011]禁忌
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4887198.html
Copyright © 2011-2022 走看看