Alternative zu assert
Content |
Es war ärgerlich, dass wir die Zugriffsfunktionen nicht noexcept deklarieren konnten. Das können wir erreichen, indem wir unsere eigene Version von assert formulieren.
Aufgabe
Entwickeln Sie Ihre eigene Version assert.hpp mit dem Makro ASSERT, das als Ersatz für <cassert> mit dem Makro assert dient. Dabei sind folgende Punkte zu beachten:
-
Wenn das Makro NDEBUG definiert ist, sollte die Assertion inaktiv sein. Sie können das mit #ifndef NDEBUG überprüfen.
-
Andernfalls sollte eine mit noexcept deklarierte inline-Funktion aufgerufen werden mit allen notwendigen Parametern:
-
Die Bedingung als Zeichenkette (das geht mit dem Präprozessor-Operator #, d.h. für den Makroparameter condition mit dem Text index < size liefert #condition die Zeichenkette "index < size".
-
Den Dateinamen des Aufrufers, den Sie über das Makro __FILE__ erhalten.
-
Die Zeilennummer, die Sie über das Makro __LINE__ erhalten.
-
Den Funktionsnamen des Aufrufers, den Sie über __func__ erhalten.
-
-
Diese Funktion sollte im Falle einer fehlschlagenden Assertion auf std::cerr eine Fehlermeldung analog zum originalen assert ausgeben und schließlich std::abort aufrufen.
Achten Sie darauf, dass noexcept wirklich sichergestellt ist.
Testen Sie es mit einem kleinen Testprogramm, das auf ein Array-Element außerhalb des zulässigen Bereichs zuzugreifen versucht.