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