MACRO do-while(0) 的几个用法

来源:互联网 发布:阿里云 包括域名 编辑:程序博客网 时间:2024/06/08 05:36

作者:邹南,华清远见嵌入式培训中心讲师。

一、格式

define MACRO_NAME(para) do{macro content}while(0)的格式,总结了以下几个原因:

1、空的宏定义避免warning:

#define foo() do{}while(0)

2、存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。

3、如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现:

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

在以下情况下:

if(NULL == pPointer)
        foo();

就会出现action1和action2不会同时被执行的情况,而这显然不是程序设计的目的。

4、以上的第3种情况用单独的{}也可以实现,但是为什么一定要一个do{}while(0)呢,看以下代码:

#define switch(x,y)
        {
                int tmp;
                tmp=x;6
                x=y;
                y=tmp;
        }
        if(x>y)
        switch(x,y);
        else //error, parse error before else
        otheraction();在把宏引入代码中,会多出一个分号,从而会报错。

(Dave Miller的说法):

编译器对于空语句会给出告警,这是为什么#define FOO do{ }while(0);

给定一个基本块(局部可视域),定义很多局部变量;

(Ben Collins的说法):

在条件代码中,允许定义复杂的宏。可以想像有很多行宏,如下代码:

(Per Persson的说法):

像 Miller and Collins指出的那样,需要一个块语句包含多个代码行和声明局部变量。但是,本质如下面例子代码:

#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }

上面代码在有些时候却不能有效工作,下面代码是一个有两个分支的if语句:
        if (x > y)
                exch(x,y); // Branch 1else do_something(); // Branch 2展开后代码如下:
        if (x > y) {
                // Single-branch if-statement!!!
                int tmp; // The one and only branch consists
                tmp = x; // of the block.
                x = y;
                y = tmp;};

嵌入式及3G相关资源及学习请点击:嵌入式开发视频 android开发视频 android培训 3G培训 QT培训 QT开发视频 物联网培训 物联网技术视频 嵌入式学习 

原创粉丝点击