最近学习linux内核代码的时候,看到里面很多宏都是使用了 do {...;}while(0)的形式。
如:
#define preempt_disable() \
do { \
inc_preempt_count(); \
barrier()' \
}while(0)
#define inc_preempt_count() \
do { \
preempt_count() ++;\
}while(0)
#define preempt_count() (current_thread_info()->preempt_count)
使用do {} while (0)是有很大的作用的,是一种良好的编程习惯。
举个例子:
if (true)
preempt_disable();
else {
// do sth
}
宏展开:
if (true)
do { \
inc_preempt_count(); \
barrier()' \
}while(0)
;else {
// do sth
}
如果没有do{} while(0),那么展开:
if (true)
inc_preempt_count();
barrier();
else {
// do sth
}
其中 else 就没有对应的if,会出现变异错误。其中第一个if 语句中,只有第一个语句,第二个语句不在if的条件范围中。
可能有的人会说,那我加一个花括号,就好了,如下:
if (true) {
inc_preempt_count();
barrier();
};
else {
// do sth
}
在else前面的}后面的那个;,是会导致变异错误的,else 找不到匹配的if.