Добавить пользовательские сообщения в assert?


есть ли способ добавить или отредактировать сообщение, брошенное assert? Я хотел бы использовать что-то вроде

assert(a == b, "A must be equal to B");

затем, компилятор добавляет строка,времени и так далее...

это возможно?

8 91

8 ответов:

Хак я видел вокруг, чтобы использовать && оператора. Поскольку указатель "является истинным", если он не равен нулю, вы можете сделать следующее без изменения условия:

assert(a == b && "A is not equal to B");

С assert показывает условие, которое не удалось, он будет отображать ваше сообщение тоже. Если этого недостаточно, вы можете написать свой собственный myAssert функция или макрос, который будет отображать все, что вы хотите.

другой вариант состоит в том, чтобы отменить операнды и использовать оператор запятой. Вам нужны дополнительные скобки, чтобы запятая не рассматривалась как разделитель между аргументами:

assert(("A must be equal to B", a == b));

(Это было скопировано из комментов выше, для лучшей видимости)

BOOST_ASSERT_MSG(expre, msg)

http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html

вы можете использовать это напрямую или скопировать код Boost. Также обратите внимание, что Boost assert-это только заголовок, поэтому вы можете просто захватить этот единственный файл, если вы не хотите устанавливать все Boost.

вот моя версия assert макроса, который принимает сообщение и печатает все ясно:

#include <iostream>

#ifndef NDEBUG
#   define M_Assert(Expr, Msg) \
    __M_Assert(#Expr, Expr, __FILE__, __LINE__, Msg)
#else
#   define M_Assert(Expr, Msg) ;
#endif

void __M_Assert(const char* expr_str, bool expr, const char* file, int line, const char* msg)
{
    if (!expr)
    {
        std::cerr << "Assert failed:\t" << msg << "\n"
            << "Expected:\t" << expr_str << "\n"
            << "Source:\t\t" << file << ", line " << line << "\n";
        abort();
    }
}

теперь вы можете использовать этот

M_Assert(ptr != nullptr, "MyFunction: requires non-null argument");

и в случае неудачи вы получите сообщение вроде этого:

Assert failed: MyFunction: требуется ненулевой аргумент

ожидается: ptr != nullptr

Источник: C:\MyProject\src.cpp, линия 22

хороший и чистый, чувствовать себя бесплатно использовать его в своем коде =)

поскольку ответ zneak несколько сворачивает код, лучший подход-просто прокомментировать текст строки, о котором вы говорите. то есть.:

assert(a == b); // A must be equal to B

Так как читатель ошибки assert будет искать файл и строку в любом случае из сообщения об ошибке, они увидят полное объяснение здесь.

потому что, в конце концов, это:

assert(number_of_frames != 0); // Has frames to update

читает лучше, чем это:

assert(number_of_frames != 0 && "Has frames to update");

С точки зрения человеческого разбора кода ie. удобочитаемость. Также не языковой Хак.

assert-это комбинация макроса и функции. вы можете определить свой собственный макрос/функцию, используя __FILE__,__BASE_FILE__,__LINE__ etc, с вашей собственной функцией, которая принимает пользовательское сообщение

почему никто не упомянул самое чистое решение?

bool AMustBeEqualToB = (a == b);
assert(AMustBeEqualToB);

для vc добавьте следующий код в assert.ч.,

#define assert2(_Expression, _Msg) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Msg), _CRT_WIDE(__FILE__), __LINE__), 0) )