普通宏 #define foo(x) bar(x); baz(x) 在 if (!feral) foo(wolf); 中展開為:
if (!feral)
bar(wolf);
baz(wolf); // 錯誤!baz 無條件執行
#define __set_task_state(tsk, state_value) \
do { (tsk)->state = (state_value); } while(0)
優勢:
1. 整個宏成單一語句,配合尾隨分號語法一致。
2. 無論是否加大括號、是否在 if/else/for 中,行為一致。
3. 編譯器優化會移除無意義循環,零開銷。
do {…} while(0) 是 C 中唯一構造,讓宏總以相同方式工作,不管怎麼用(尤其無大括號時),宏後分號效果一致。
總結:用此模式包裹多語句宏,消除語句邊界陷阱,是 Linux 內核、主流 C 庫標準做法。