在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的一般寫法吻合,看起來非常違和。那么這時候采用我們在文章開頭提到的形式來定義宏定義,就可以讓多行命令組成的宏定義可以表現的如同一行命令一樣。