Відповіді:
Злом, який я бачив, - це використовувати &&
оператора. Оскільки вказівник "true", якщо він не є null, ви можете зробити наступне, не змінюючи умови:
assert(a == b && "A is not equal to B");
Оскільки assert
відображається умова, що не вдалося, воно відобразить і ваше повідомлення. Якщо цього недостатньо, ви можете написати власну myAssert
функцію або макрос, який відображатиме все, що завгодно.
assert(("A must be equal to B", a == b));
assert(a == b && "A (" << A << ") is not equal to B (" << B << ")");
printf
повертає ненульове значення, якщо він щось надрукував, тож ви могли б зробити щось на кшталт assert(a == b && printf("a (%i) is not equal to b (%i)", a, b))
, хоча в цей момент ви, мабуть, повинні написати власну обгортку затвердження.
Інший варіант - повернути операнди та використовувати оператор комами. Вам потрібні додаткові дужки, щоб кома не розглядалася як роздільник між аргументами:
assert(("A must be equal to B", a == b));
(це було скопійовано з вищезазначених коментарів для кращої наочності)
#define m_assert(expr, msg) assert(( (void)(msg), (expr) ))
Ось моя версія макросу 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
Приємно і чисто, не соромтеся використовувати його у своєму коді =)
x == y
. Потім Expr розшириться, if( !(x == y))
і тут перевіряється умова, а #Expr перетвориться на рядковий літерал "x == y"
, який ми потім вводимо в повідомлення про помилку.
BOOST_ASSERT_MSG(expre, msg)
http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html
Ви можете використовувати це безпосередньо або скопіювати код Boost. Також зауважте, що Boost assert є лише заголовком, так що ви можете просто захопити цей єдиний файл, якщо ви не хочете встановити весь Boost.
Оскільки відповідь zneak дещо змінює код, кращим підходом є просто коментувати текст рядка, про який ви говорите. тобто .:
assert(a == b); // A must be equal to B
Оскільки читач помилки утвердження буде шукати файл і рядок все одно з повідомлення про помилку, тут він побачить повне пояснення.
Тому що, наприкінці дня, це:
assert(number_of_frames != 0); // Has frames to update
читає краще за це:
assert(number_of_frames != 0 && "Has frames to update");
з точки зору людського розбору коду, тобто. читабельність. Також не мовний злом.
assrt - комбінація макро / функцій. ви можете визначити свій власний макро / функцію, використовуючи__FILE__
, __BASE_FILE__
, і __LINE__
т.д., з вашої власної функції , яка приймає призначене для користувача повідомлення