首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言基礎

C 語言宏定義最佳實踐:do {...} while (0) 避免語句邊界錯誤的原理與實例

     編輯:C 語言基礎

問題場景

普通宏 #define foo(x) bar(x); baz(x) 在 if (!feral) foo(wolf); 中展開為:

if (!feral)
    bar(wolf);
baz(wolf);  // 錯誤!baz 無條件執行

do {…} while(0) 解決方案

#define __set_task_state(tsk, state_value) \
    do { (tsk)->state = (state_value); } while(0)

優勢:
1. 整個宏成單一語句,配合尾隨分號語法一致。
2. 無論是否加大括號、是否在 if/else/for 中,行為一致。
3. 編譯器優化會移除無意義循環,零開銷。

Robert Love 解讀

do {…} while(0) 是 C 中唯一構造,讓宏總以相同方式工作,不管怎麼用(尤其無大括號時),宏後分號效果一致。

總結:用此模式包裹多語句宏,消除語句邊界陷阱,是 Linux 內核、主流 C 庫標準做法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved