当我阅读Linux内核代码时,头文件通常有#define
块看起来像(来自2.6.37中的include/linux/wait.h
):
#define init_waitqueue_head(q) \
do { \
... \
} while (0)
当“循环”只执行一次时do...while
序列的目的是什么?程序员想要为临时变量打开一个新的范围是有道理的,但这不需要do...while
存在。它只是语法糖,还是以某种方式帮助编译器?
同样,我已经看到了一行代码if
看起来像(来自include/linux/kfifo.h
):
#define kfifo_put(fifo, val) \
... \
if (0) { \
... \
}
同样在#define
中,为什么不删除那个花絮而不是让它永远不会运行?我会注意到,在kfifo_put
定义中,范围界定以{
开头,以}
结束而没有do...while
循环。