断言失败时如何打印附加信息?

Fra*_*ank 18 c++ debugging assert

如果assert失败,通常会想要打印其他信息.一种方法是这样的:

assert(vec.size() > i || 
  !(std::cerr << "False: " << vec.size() << ">" << i))
Run Code Online (Sandbox Code Playgroud)

这样,当assert失败时打印实际尺寸.但它很难看,并且很容易忘记!,这将使断言条件成立,程序将继续.

如上所述,人们使用什么来打印关于断言失败的其他信息?

Not*_*ist 11

#define ASSERT(condition) { if(!(condition)){ std::cerr << "ASSERT FAILED: " << #condition << " @ " << __FILE__ << " (" << __LINE__ << ")" << std::endl; } }
Run Code Online (Sandbox Code Playgroud)

用法:

ASSERT(vec.size()>1);
Run Code Online (Sandbox Code Playgroud)

结果:

ASSERT FAILED: vec.size()>1 @ main.cpp (17)
Run Code Online (Sandbox Code Playgroud)

根据您的需要,您可以选择将DebugBreak()或者exit(-1)watever放入宏中.

已更新的宏左侧和右侧分开:

#define ASSERT(left,operator,right) { if(!((left) operator (right))){ std::cerr << "ASSERT FAILED: " << #left << #operator << #right << " @ " << __FILE__ << " (" << __LINE__ << "). " << #left << "=" << (left) << "; " << #right << "=" << (right) << std::endl; } }
Run Code Online (Sandbox Code Playgroud)

用法:

ASSERT(a,>,b);
Run Code Online (Sandbox Code Playgroud)

结果:

ASSERT FAILED: a>b @ assert2.cpp (8). a=3; b=4
Run Code Online (Sandbox Code Playgroud)


Unc*_*ens 5

如上所述,人们使用什么来打印关于断言失败的其他信息?

通常我只是添加一个描述条件含义的字符串文字:

assert(v.size() > i && "The vector really needs to be larger");
Run Code Online (Sandbox Code Playgroud)

但也许像这样的宏:

#include <cassert>
#include <vector>
#include <iostream>

//#define NDEBUG

#ifndef NDEBUG
#define ASSERT_EX(condition, statement) \
    do { \
        if (!(condition)) { statement; assert(condition); } \
    } while (false)
#else
#define ASSERT_EX(condition, statement) ((void)0)
#endif

int main()
{
    std::vector<int> v;
    unsigned i = 1;
    ASSERT_EX(v.size() > i, std::cerr << "i = " << i << ", v.size() = " << v.size() << '\n');
}
Run Code Online (Sandbox Code Playgroud)

但是,如果statement没有副作用,改变condition评估方式,这将是很好的.:)