美文网首页Linux GeekKernel
do{…} while(0)类型的宏的作用

do{…} while(0)类型的宏的作用

作者: 治部少辅 | 来源:发表于2017-09-19 15:57 被阅读11次

    在Linux内核里面,经常会看见这样子的宏定义

    #define mod_info( args... ) \
            do { printk( KERN_INFO "%s - %s : ", MODNAME, __FUNCTION__);\
            printk( args ); } while(0)
    

    其中使用了一个do { … } while (0)循环。可是,看起来这个循环并没有起到作用。那么什么这么定义呢?我们先尝试把这个循环拿掉。

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

    在使用这个宏时,一般也没有问题FOO(x);。但是我们考虑下面这个情况:

    if (condition)
        FOO(x);
    else
        // ...
    

    此时就会出现语法错误。如果考虑加上大括号的话

    #define FOO(x) { foo(x); bar(x); }
    

    我们在调用的时候就得写成

    Foo(x)
    

    没有尾部的分号,就无法与C的一般写法吻合,看起来非常违和。那么这时候采用我们在文章开头提到的形式来定义宏定义,就可以让多行命令组成的宏定义可以表现的如同一行命令一样

    相关文章

      网友评论

        本文标题:do{…} while(0)类型的宏的作用

        本文链接:https://www.haomeiwen.com/subject/sczwsxtx.html