Linux GeekKernel

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

2017-09-19  本文已影响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的一般写法吻合,看起来非常违和。那么这时候采用我们在文章开头提到的形式来定义宏定义,就可以让多行命令组成的宏定义可以表现的如同一行命令一样

上一篇 下一篇

猜你喜欢

热点阅读