如何实现支持iostream的C++ CHECK断言函数?
实现C++ CHECK()宏的方案
核心思路
要实现支持流式输出的CHECK宏,需要结合宏定义和辅助类:
- 宏用于判断条件是否成立,条件不成立时触发后续的输出逻辑
- 辅助类重载
<<运算符,收集输出内容,并在合适时机终止程序
完整实现代码
#include <iostream> #include <cstdlib> // 用于std::exit // 辅助类:负责收集错误信息并在析构时终止程序 class CheckFailure { public: // 构造函数:标记是否需要处理错误输出 explicit CheckFailure(bool should_fail) : should_fail_(should_fail) { if (should_fail_) { std::cerr << "CHECK failed: "; } } // 析构函数:如果需要终止,输出换行并退出程序 ~CheckFailure() { if (should_fail_) { std::cerr << std::endl; std::exit(EXIT_FAILURE); // 终止程序,EXIT_FAILURE表示异常退出 } } // 重载<<运算符:仅当需要处理错误时,将内容输出到cerr template<typename T> CheckFailure& operator<<(const T& value) { if (should_fail_) { std::cerr << value; } return *this; } private: bool should_fail_; }; // 定义CHECK宏:条件不成立时创建CheckFailure对象,触发输出和终止 #define CHECK(condition) \ if (!(condition)) CheckFailure(true) \ else CheckFailure(false) // 使用示例 int main() { int a = 1; int b = 2; int c = 1; CHECK(a == b) << "check failed"; // 条件不成立,输出"CHECK failed: check failed"后终止程序 CHECK(a == c) << "check failed"; // 条件成立,无任何输出和操作 return 0; }
关键细节说明
- 宏的逻辑:
CHECK(condition)展开后,当condition为假时,创建CheckFailure(true)对象,触发错误输出;为真时创建CheckFailure(false),所有<<操作都会被忽略。 - 程序终止:使用
std::exit(EXIT_FAILURE)终止程序,它会调用全局对象的析构函数,比std::abort更安全(abort会直接终止,不执行析构)。 - 扩展优化:可以在宏中加入
__FILE__和__LINE__,输出错误发生的文件和行号,方便调试:
这样输出会变成:#define CHECK(condition) \ if (!(condition)) CheckFailure(true) << "[" << __FILE__ << ":" << __LINE__ << "] " \ else CheckFailure(false)CHECK failed: [main.cpp:28] check failed
内容的提问来源于stack exchange,提问作者Zeyu Zhang CN
相关产品推荐
相关产品推荐

