用宏,务必写清文档并用 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 被宏展开截断
修复后