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

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

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

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

Возможно ли это?

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

BOOST_ASSERT_MSG(expre, msg)

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

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

Ответ 4

Здесь моя версия макроса 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");

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

Ошибка подтверждения: MyFunction: требуется непустой аргумент

Ожидаемое: ptr!= nullptr

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

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

Ответ 5

Поскольку 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");

в терминах человеческого разбора кода, т.е. читаемость. Также не взлом языка.

Ответ 6

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

Ответ 7

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

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

Ответ 9

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

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