Was ist mit std::assert passiert?

Lesezeit: 2 Minuten

Benutzer-Avatar
Jonathan Mei

Diese Antwort und ihre Vielzahl von Duplikaten weisen darauf hin, dass ich sie verwenden sollte #include <c*> für die C-Header, die ich in C++-Code ziehe und mit denen ich sie aufrufen sollte std::*.

Ich habe das getan, aber ich bemerke eine Ausnahme. std::assert scheint nicht definiert zu sein, auch wenn ich richtig bin #include <cassert>.

Was ist denn hier los? Handelt es sich um ein Versehen bei der Umsetzung oder um eine tatsächliche Ausnahme?

  • assert ist ein Makro

    – smac89

    9. Mai 2016 um 19:46 Uhr


  • assert wird höchstwahrscheinlich als Makro implementiert, das nicht im Namensraum verwendet werden kann (weil es keine Sprachkennung erzeugt, wie es die Inline-Funktion tut).

    – myaut

    9. Mai 2016 um 19:46 Uhr


  • @SergeyA Hast du deinen Code noch nie getestet … jemals?

    – Barri

    9. Mai 2016 um 19:54 Uhr

  • @SergeyA: Da bin ich bei dir. Funktionalität, die aufhört, Dinge zu tun, wenn Sie in der Produktion sind. Also völlig unterschiedliches Verhalten für Produktions- und Debug-Code. Wenn nur beim Testen und nicht in der Produktion etwas schief geht, dann haben Sie einen außergewöhnlichen Code. Oh hey warte, wir haben etwas für Ausnahmesituationen.

    – Martin York

    9. Mai 2016 um 19:58 Uhr


  • @SergeyA: Es hat einen Wert für Leute, die Ihre Behauptung finden “Alle komischen Dinge mit ungültig gemachten Varianten passieren normalerweise in optimiertem Code” falsch sein.

    – Benjamin Lindley

    9. Mai 2016 um 20:00 Uhr

Benutzer-Avatar
R Sahu

assert ist ein Makro, keine Funktion. Daher muss es mit einfachem Alt verwendet werden assert(condition).

Hier ist ein unterstützender Link: http://en.cppreference.com/w/cpp/error/assert.

  • Ich dachte nur, ein unterstützender Link könnte hier hilfreich sein: de.cppreference.com/w/cpp/error/assert

    – Jonathan Mei

    10. Mai 2016 um 12:57 Uhr

  • Zur Referenz: Der C++17-Standard listet dies in Kapitel 20.5.1.2 Absatz 5 auf ([headers]): “Namen, die in C als Makros definiert sind, sollen in der C++-Standardbibliothek als Makros definiert werden […]”

    – Doke

    19. März 2019 um 10:47 Uhr

assert ist ein Makro, daher ist es nicht möglich, es auf einen Namensraum zu beschränken.

1304270cookie-checkWas ist mit std::assert passiert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy