Gibt es eine Möglichkeit, die von assert ausgelöste Nachricht hinzuzufügen oder zu bearbeiten? Ich würde gerne so etwas verwenden
assert(a == b, "A must be equal to B");
Dann fügt der Compiler Zeile , Zeit usw. hinzu ...
Ist es möglich?
Gibt es eine Möglichkeit, die von assert ausgelöste Nachricht hinzuzufügen oder zu bearbeiten? Ich würde gerne so etwas verwenden
assert(a == b, "A must be equal to B");
Dann fügt der Compiler Zeile , Zeit usw. hinzu ...
Ist es möglich?
Antworten:
Ein Hack, den ich gesehen habe, ist die Verwendung des &&
Operators. Da ein Zeiger "wahr" ist, wenn er nicht null ist, können Sie Folgendes tun, ohne die Bedingung zu ändern:
assert(a == b && "A is not equal to B");
Da assert
der Zustand angezeigt wird, der fehlgeschlagen ist, wird auch Ihre Nachricht angezeigt. Wenn es nicht ausreicht, können Sie Ihre eigene myAssert
Funktion oder Ihr eigenes Makro schreiben , das alles anzeigt, was Sie wollen.
assert(("A must be equal to B", a == b));
assert(a == b && "A (" << A << ") is not equal to B (" << B << ")");
printf
gibt einen Wert ungleich Null zurück, wenn etwas gedruckt wurde, sodass Sie so etwas tun können assert(a == b && printf("a (%i) is not equal to b (%i)", a, b))
, obwohl Sie an diesem Punkt wahrscheinlich Ihren eigenen Assert-Wrapper schreiben sollten.
Eine andere Möglichkeit besteht darin, die Operanden umzukehren und den Kommaoperator zu verwenden. Sie benötigen zusätzliche Klammern, damit das Komma nicht als Trennzeichen zwischen den Argumenten behandelt wird:
assert(("A must be equal to B", a == b));
(Dies wurde aus Gründen der besseren Sichtbarkeit aus den obigen Kommentaren kopiert.)
#define m_assert(expr, msg) assert(( (void)(msg), (expr) ))
Hier ist meine Version des Assert-Makros, das die Nachricht akzeptiert und alles klar ausdruckt:
#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();
}
}
Jetzt können Sie dies verwenden
M_Assert(ptr != nullptr, "MyFunction: requires non-null argument");
Und im Fehlerfall erhalten Sie eine Meldung wie folgt:
Assert fehlgeschlagen: MyFunction: erfordert ein Argument ungleich Null
Erwartet: ptr! = Nullptr
Quelle: C: \ MyProject \ src.cpp, Zeile 22
Schön und sauber, zögern Sie nicht, es in Ihrem Code zu verwenden =)
x == y
. Dann wird Expr erweitert if( !(x == y))
und hier wird die Bedingung überprüft, und #Expr wird in ein Zeichenfolgenliteral erweitert "x == y"
, das wir dann in eine Fehlermeldung einfügen .
BOOST_ASSERT_MSG(expre, msg)
http://www.boost.org/doc/libs/1_51_0/libs/utility/assert.html
Sie können das entweder direkt verwenden oder den Code von Boost kopieren. Beachten Sie auch, dass Boost Assert nur ein Header ist, sodass Sie nur diese einzelne Datei abrufen können, wenn Sie nicht den gesamten Boost installieren möchten.
Da die Antwort von zneak den Code etwas verwickelt, ist es besser, nur den Zeichenfolgentext zu kommentieren, über den Sie sprechen. dh:
assert(a == b); // A must be equal to B
Da der Leser des Assert-Fehlers die Datei und die Zeile ohnehin anhand der Fehlermeldung nachschlägt, wird hier die vollständige Erklärung angezeigt.
Denn am Ende des Tages ist dies:
assert(number_of_frames != 0); // Has frames to update
liest sich besser als das:
assert(number_of_frames != 0 && "Has frames to update");
in Bezug auf die menschliche Analyse von Code dh. Lesbarkeit. Auch kein Sprachhack.
assert ist eine Makro- / Funktionskombination. Sie können Ihre eigene Makro / Funktion, mit definieren __FILE__
, __BASE_FILE__
, __LINE__
etc, mit Ihrer eigenen Funktion, nimmt eine benutzerdefinierte Nachricht
Fügen Sie für vc den folgenden Code in assert.h hinzu:
#define assert2(_Expression, _Msg) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Msg), _CRT_WIDE(__FILE__), __LINE__), 0) )