将assert()与消息一起使用

时间:2013-05-27 15:08:41

标签: c++ c assert

是否可以在断言错误上写一条消息?

例如,使用#include <assert.h>,我只能写:

void foo(int a, int b) {
  assert (a != b);
}

但是,如果出现错误,我希望看到ab的值。我怎么能这样做?

3 个答案:

答案 0 :(得分:6)

assert只是一个预处理器宏,如果条件失败则调用abort。您可以使用简单的if语句轻松制作自己的语句,如果失败则打印值并调用abort,就像assert一样:

void foo(int a, int b)
{
    if (a != b)
    {
        std::cerr << "My own assertion failed: a = " << a << ", b = " << b << '\n';
        abort();
    }

    /* ... */
}

但是,当您使用C ++时,您应该抛出异常,可能是std::logic_error

void foo(int a, int b)
{
    if (a != b)
    {
        std::istringstream is;
        is << "Argument mismatch in `foo`: a = " << a << ", b = " << b;
        throw std::logic_error(is.str());
    }

    /* ... */
}

答案 1 :(得分:4)

我通常只使用assert(a != b && "This is my error message")。这是有效的,因为char*可以转换为bool并且永远不会为false(因为地址不是0)。

答案 2 :(得分:1)

可以编写自己的断言宏,它可以将表达式分解为子表达式并打印每个值的值;但是它需要很多代码才能支持它,标准的assert宏在我所知道的任何实现上都不会这样做。

有关如何实现此类操作的示例,请参阅CATCH test framework,特别是CHECK宏的实现。

或者,您可以编写像ASSERT_EQUAL(a,b)这样的宏或函数,将每个子表达式作为单独的参数。

或者您可以在没有assert

的情况下编写自己的错误处理代码
if (a == b) {
    throw std::runtime_error("foo: a(" + std::to_string(a) + ") must not equal b");
}