Wie werden Aussagen in C++ gemacht? Beispielcode wird geschätzt.Was sind Behauptungen? und warum würdest du sie benutzen?
Antwort
Asserts sind eine Möglichkeit, die Annahmen Ihres Codes explizit zu überprüfen. Dadurch können Sie viele Fehler aufspüren, indem Sie die möglichen Probleme eingrenzen. Sie werden normalerweise nur in einem speziellen "Debug" -Build Ihrer Anwendung ausgewertet, sodass sie die endgültige Version nicht verlangsamen.
Nehmen wir an, Sie haben eine Funktion geschrieben, die einen Zeiger als Argument verwendet hat. Es besteht eine gute Chance, dass Ihr Code davon ausgeht, dass der Zeiger nicht NULL ist. Warum also nicht explizit das mit einer Assertion überprüfen? Hier ist, wie:
#include <assert.h>
void function(int* pointer_arg)
{
assert(pointer_arg != NULL);
...
}
Eine wichtige Sache zu beachten ist, dass die Ausdrücke, die Sie behaupten darf nie Nebenwirkungen haben, da sie in der Release-Build nicht vorhanden sein wird. Also nie so etwas tun:
assert(a++ == 5);
Manche Leute fügen auch gerne kleine Nachrichten in ihre Aussagen ein, um ihnen Bedeutung zu geben. Da immer eine Zeichenfolge auf true evaulates, könnte man schreiben:
assert((a == 5) && "a has the wrong value!!");
Behauptung sind boolesche Ausdrücke, die normalerweise immer wahr sein sollten.
Sie werden verwendet, um sicherzustellen, was Sie erwartet haben, ist auch, was passiert.
void some_function(int age)
{
assert(age > 0);
}
Sie schrieb die Funktion mit Alter zu tun, können Sie auch ‚wissen‘ für sicher, dass Sie immer vernünftige Argumente zu übergeben, dann verwenden Sie eine Assertion. Es ist so, als würde man sagen: "Ich weiß, das kann nie schiefgehen, aber wenn es so ist, will ich es wissen", denn nun, jeder macht Fehler.
Es ist also nicht auf vernünftige Benutzereingaben zu prüfen, wenn es Szenarien gibt, in denen etwas schiefgehen kann, verwenden Sie keine Assert. Führen Sie echte Prüfungen durch und behandeln Sie die Fehler.
Asserts sind in der Regel nur für Debug-Builds, also setzen Sie keinen Code mit Nebeneffekten in Anrecht.
Eine Assertion fügen Sie Ihrem Programm hinzu, wodurch das Programm sofort gestoppt wird, wenn eine Bedingung erfüllt ist, und eine Fehlermeldung angezeigt wird. Sie verwenden sie normalerweise für Dinge, von denen Sie glauben, dass sie nie in Ihrem Code passieren können.
Hier ist ein definition von dem, was eine Behauptung ist und here ist einige Codebeispiel. Kurz gesagt, eine Behauptung ist eine Möglichkeit für einen Entwickler, seine (oder ihre) Annahmen über den Status des Codes zu jedem beliebigen Zeitpunkt zu testen. wenn Sie den folgenden Code zum Beispiel taten:
mypointer->myfunct();
Sie wahrscheinlich, dass MyPointer behaupten wollen, ist nicht NULL, weil das Ihre Annahme ist - dass MyPointer nie vor dem Aufruf NULL sein wird.
Behauptungen sind Aussagen, mit denen Sie alle Annahmen testen können, die Sie in Ihrem Programm haben könnten. Dies ist besonders nützlich, um Ihre Programmlogik zu dokumentieren (Vorbedingungen und Nachbedingungen). Behauptungen, die fehlschlagen, verursachen normalerweise Laufzeitfehler und sind Anzeichen dafür, dass etwas SEHR falsch mit Ihrem Programm ist - Ihre Behauptung ist fehlgeschlagen, weil etwas, das Sie für wahr hielten, nicht war. Die üblichen Gründe sind: Es gibt einen Fehler in der Logik Ihrer Funktion, oder der Aufrufer Ihrer Funktion hat Ihnen schlechte Daten übermittelt.
Assertions werden verwendet, um Designannahmen zu überprüfen, normalerweise in Bezug auf Eingabeparameter und Rückgabeergebnisse. Beispiel:
// Given customer and product details for a sale, generate an invoice
Invoice ProcessOrder(Customer Cust,Product Prod)
{
assert(IsValid(Cust));
assert(IsValid(Prod);
'
'
'
assert(IsValid(RetInvoice))
return(RetInvoice);
}
Die Anweisungen assert werden nicht für die Ausführung des Codes benötigt, sie überprüfen jedoch die Gültigkeit der Eingabe und Ausgabe. Wenn die Eingabe ungültig ist, liegt ein Fehler in der aufrufenden Funktion vor. Wenn die Eingabe gültig ist und die Ausgabe ungültig ist, liegt ein Fehler in diesem Code vor. Weitere Einzelheiten zu dieser Verwendung von Behauptungen finden Sie unter design by contract.
Bearbeiten: Wie in anderen Posts darauf hingewiesen, ist die Standardimplementierung von Assert nicht in der Laufzeit der Veröffentlichung enthalten. Eine gängige Praxis, die viele nutzen würden, einschließlich mir selbst, besteht darin, sie durch eine Version zu ersetzen, die im Release-Build enthalten ist, aber nur in einem Diagnosemodus aufgerufen wird. Dies ermöglicht ordnungsgemäße Regressionstests für Release-Builds mit vollständiger Assertion-Überprüfung. Meine Version ist wie folgt;
Es gibt einen geringen Laufzeitaufwand in dieser Technik, aber es macht das Verfolgen von Fehlern, die es ins Feld geschafft haben, viel einfacher.
Verwenden Behauptungen für „kann nicht passieren“ Situationen zu überprüfen.
Typische Verwendung: Prüfung auf ungültige/unmögliche Argumente am Anfang einer Funktion.
Selten gesehen, aber immer noch nützlich: Schleifen Invarianten und Nachbedingungen.
Adresse Dies schließt nicht assert Anlage, die von der frühen C Tage zu uns gekommen ist, aber Sie sollten auch von Boost StaticAssert Funktionalität, in dem Fall, dass Ihre Projekte Boost-bewusst sein können.
Die Standard-C/C++ -Asssert funktioniert während der Laufzeit. Die Boost StaticAssert-Funktion ermöglicht es Ihnen, einige Klassen von Assertions zur Kompilierzeit zu erstellen, Logikfehler und dergleichen noch früher zu erfassen.
Ich habe nicht den anding mit einem String gesehen. Wirklich nützlich! –
Diese Art von Trick (oder eine ähnliche Variation) wird die ganze Zeit in Perl-Land verwendet, nämlich mit dem gegebenen Beispiel: a == 5 || sterben ("a hat den falschen Wert"); Hurra für loses boolesches Tippen. –
Ein weiterer Trick in diesem String ist die Validierung von Werten im Freigabecode, aber die Aktivierung im Debug-Code. Verwenden Sie zum Beispiel ein if (x> 10) zunächst prüfen, und dann, wenn der fehlerhafte Zustand geht, behaupten nur (! „X außerhalb der Grenzen“) und dann in eine Log-Datei drucken, usw. – Marcin