C++ 将assert()与消息一起使用

C++ 将assert()与消息一起使用,c++,c,assert,C++,C,Assert,是否可以在断言错误时写入消息 例如,使用include,我只能写: void foo(int a, int b) { assert (a != b); } 但是,在一个错误中,我希望看到a和b的值。我该怎么做呢?assert只是一个预处理器宏,如果条件失败,它将调用abort。您可以使用一个简单的if语句轻松地创建自己的if语句,如果它失败,则可以像assert一样打印值并调用abort: assert只是一个预处理器宏,如果条件失败,它将调用abort。您可以使用一个简单的if语句轻松地

是否可以在断言错误时写入消息

例如,使用include,我只能写:

void foo(int a, int b) {
  assert (a != b);
}
但是,在一个错误中,我希望看到a和b的值。我该怎么做呢?

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

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


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

有关如何实现此类操作的示例,请参见,特别是CHECK宏的实现

或者,您可以编写宏或函数,如ASSERT_EQUALa,b,将每个子表达式作为单独的参数

或者,您可以编写自己的错误处理代码而不使用断言


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

有关如何实现此类操作的示例,请参见,特别是CHECK宏的实现

或者,您可以编写宏或函数,如ASSERT_EQUALa,b,将每个子表达式作为单独的参数

或者,您可以编写自己的错误处理代码而不使用断言


我通常只使用asserta!=b&这是我的错误消息。这是因为char*可以转换为bool,而且它永远不会为false,因为地址不是0。

我通常只使用asserta!=b&这是我的错误消息。这是因为char*可以转换为bool,而且它永远不会为false,因为地址不是0。

if!a!=这个标题有点误导人。首先想到的是资产!=b&&错误消息解决方案,这不是您要查看的。如果!a!=这个标题有点误导人。首先想到的是资产!=b&&错误消息解决方案,这不是您想要看到的。Marco是可能的,但我不想使用它。@mahmood:您可能会将其实现为一个函数,但这样您就会丢失uu FILE和u LINE宏,它们告诉您断言在代码中的位置,以及将表达式捕获为字符串的能力。Marco是可能的,但是我不想使用它。@mahmood:您可能会将其作为函数实现,但这样您就会丢失告诉您断言在代码中的位置以及将表达式捕获为字符串的能力的\uuuu文件\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu宏。对于断言,我认为也应该使用ifdef调试这是正确的,但正确的宏是NDEBUG,具有相反的意思。也就是说,建议用异常替换断言是个坏主意。一种是运行时错误,您可以处理并从中恢复。另一个是针对内部状态不一致的编程错误,您应该转储核心并中止。对于断言,我认为也应该使用ifdef调试。这是正确的,但正确的宏是NDEBUG,其含义相反。也就是说,建议用异常替换断言是个坏主意。一种是运行时错误,您可以处理并从中恢复。另一种是针对内部状态不一致的编程错误,您应该转储内核并中止。
void foo(int a, int b)
{
    if (a != b)
    {
        std::cerr << "My own assertion failed: a = " << a << ", b = " << b << '\n';
        abort();
    }

    /* ... */
}
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());
    }

    /* ... */
}
if (a == b) {
    throw std::runtime_error("foo: a(" + std::to_string(a) + ") must not equal b");
}