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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容