Есть ли способ добавить или отредактировать сообщение, отправленное командой assert? Я хотел бы использовать что-то вроде
assert(a == b, "A must be equal to B");
Затем компилятор добавляет строку, время и т.д.
Возможно ли это?
Есть ли способ добавить или отредактировать сообщение, отправленное командой assert? Я хотел бы использовать что-то вроде
assert(a == b, "A must be equal to B");
Затем компилятор добавляет строку, время и т.д.
Возможно ли это?
Взлом, который я видел, это использовать оператор &&
. Поскольку указатель "истинно", если он не равен нулю, вы можете сделать следующее без изменения условия:
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");
И в случае неудачи вы получите сообщение вроде этого:
Ошибка подтверждения: 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");
в терминах человеческого разбора кода, т.е. читаемость. Также не взлом языка.
assert - комбинация макро/функция. вы можете определить свой собственный макро/функцию, используя __FILE__
, __BASE_FILE__
, __LINE__
и т.д., с помощью вашей собственной функции, которая принимает пользовательское сообщение
Почему никто не упоминал самое чистое решение?
bool AMustBeEqualToB = (a == b);
assert(AMustBeEqualToB);
Вы можете использовать _ASSERT_EXPR(). Для получения дополнительной информации см. Https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/assert-asserte-assert-expr-macros?view=vs-2017.
Для vc добавьте следующий код в assert.h,
#define assert2(_Expression, _Msg) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Msg), _CRT_WIDE(__FILE__), __LINE__), 0) )