問題:多資源分配的錯誤處理
bool init_all(void) {
Resource *p = NULL, *q = NULL, *r = NULL;
bool ok = true;
do {
if (!(p = alloc())) { ok = false; break; }
if (!(q = alloc())) { ok = false; break; }
if (!(r = alloc())) { ok = false; break; }
// 更多初始化...
} while (0);
if (!ok) {
free(r); free(q); free(p);
return false;
}
return true;
}
為何用 do-while(0)
- 構造單次執行的代碼塊,可在其中用
break 跳出。
- 避免
goto 標籤污染函數作用域。
- 配合宏定義時,防止分號吞噬、變量作用域洩漏:
#define SAFE_FREE(p) do { free(p); p=NULL; } while(0)
宏定義中的經典用法
總結
do { ... } while(0) 是 C 語言構造「單執行塊、可 break、可用於宏」的標準慣用法。它將 goto 的跳轉能力封裝在結構化控制流中,是 Linux 內核、開源庫廣泛採用的錯誤處理模式。