用宏,務必寫清文檔并用 do {…} while (0)為啥呢,示例
在 C/C++ 中,使用 do { … } while (0) 包裹宏定義是一種經典的最佳實踐,主要用于解決宏展開后的語法和邏輯問題。以下是詳細解釋和示例:
一、為什么用 do { … } while (0) 包裹宏?
- 避免分號導致的語法錯誤
問題場景:
cpp
#define SAFE_DELETE(ptr) delete ptr; ptr = nullptr;
// 使用時
if (condition)
SAFE_DELETE(obj); // 展開后變成:
// if (condition) delete obj; obj = nullptr;
// ? 無論 condition 如何,ptr=nullptr 都會執行!
修復后:
cpp
#define SAFE_DELETE(ptr) do { delete ptr; ptr = nullptr; } while (0)
// 展開后:
if (condition)
do { delete obj; obj = nullptr; } while (0); // ? 邏輯正確
2. 保證宏作為一個整體
問題場景:
cpp
#define INIT_RESOURCES() Q_INIT_RESOURCE(a); Q_INIT_RESOURCE(b)
// 使用時
if (needsInit)
INIT_RESOURCES();
else
return; // 展開后語法錯誤:if-else 被宏展開截斷
修復后