首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 宏定義 do-while(0) 包裹多語句:防止語法陷阱的標準模式

     編輯:程式設計綜合問答

對比:

// 寫法 1:大括號包裹
#define TEST1(a,b) { printf("%d",a); printf("%d",b); }

// 寫法 2:do-while(0) 包裹 (推薦)
#define TEST2(a,b) do { printf("%d",a); printf("%d",b); } while(0)

為何寫法 1 危險


if (x > 0)
    TEST1(1,2);
else
    printf("negative");
展開後: ```c if (x > 0) { printf("%d",1); printf("%d",2); }; // 分號結束了 if else printf("negative"); // 語法錯誤:else 無匹配 if ```

do-while(0) 解決

  • 整體為**單一語句**,後接分號合法。
  • `do { ... } while(0)` 執行恰好一次,無運行時開銷 (編譯器優化掉)。
  • 支持 `break`/`continue` 控制流 (罕見但合法)。
  • 變量作用域限制在塊內,避免污染外層。

標準庫實踐

Linux 內核、glibc、Windows SDK、Boost 所有多語句宏**統一使用 `do { ... } while(0)`**。

單語句宏無需包裹

#define SQUARE(x) ((x)*(x))  // 單表達式,括號保護優先級
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved