You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现支持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 01:36:00