[C] 當我們定義宏時,(0)有什麼用處?


Answers

它允許你將幾個語句分組成一個宏。

假設你做瞭如下的事情:

if (foo) 
    INIT_LIST_HEAD(bar);

如果宏定義為沒有封裝do {...}而while(0),則上面的代碼將擴展為

if (foo)
    (bar)->next = (bar);
    (bar)->prev = (bar);

這顯然不是想要的,因為如果foo成立,只有第一個陳述將被執行。 不管foo是否成立,第二個陳述都會被執行。

編輯:進一步的解釋在http://c-faq.com/cpp/multistmt.htmlhttp://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html #吞嚥最分號

Question

可能重複:
C / C ++宏中的Do-While和if-else語句

我正在閱讀Linux內核,並且發現了許多像這樣的宏:

#define INIT_LIST_HEAD(ptr) do { \
    (ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)

為什麼他們使用這個而不是簡單地在{}中定義它?