對比:
// 寫法 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)
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
```
Linux 內核、glibc、Windows SDK、Boost 所有多語句宏**統一使用 `do { ... } while(0)`**。
#define SQUARE(x) ((x)*(x)) // 單表達式,括號保護優先級