当我们定义一个宏时,do When(0)有什么用途?

当我们定义一个宏时,do When(0)有什么用途?

我正在阅读Linux内核,我发现许多宏都是这样的:


#define INIT_LIST_HEAD(ptr) do { \

    (ptr)->next = (ptr); (ptr)->prev = (ptr); \

} while (0)

为什么他们使用这个而不是简单地在{}中定义它?


慕后森
浏览 429回答 3
3回答

紫衣仙女

你可以用分号跟随它,使它看起来更像一个函数。它还可以正确地处理if/etc子句。如果没有while(0),上面的代码将无法使用if (doit)     INIT_LIST_HEAD(x);  else     displayError(x);因为宏后面的分号会“吃掉”OSE子句,而上面的分号甚至不会编译。

眼眸繁星

它将扩展为“{(PTR)->Next.}”,因此,一个语句后面跟着第二个语句。如果语法是“if(表达式)语句”。否则不会与任何if相关联,因为您会编写“if(表达式)语句”(一个“{.}”和一个“语句”)。
打开App,查看更多内容
随时随地看视频慕课网APP