Namensräume
Varianten
Aktionen

assert

Von cppreference.com
< c‎ | error
Definiert in Header <assert.h>
#ifdef NDEBUG

#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementierungsdefiniert*/

#endif
(bis C23)
#ifdef NDEBUG

#define assert(...) ((void)0)
#else
#define assert(...) /*implementierungsdefiniert*/

#endif
(seit C23)

Die Definition des Makros assert hängt von einem anderen Makro ab, NDEBUG, das nicht von der Standardbibliothek definiert wird.

Wenn NDEBUG an der Stelle im Quellcode, an der <assert.h> eingebunden wird, als Makroname definiert ist, dann tut assert nichts.

Wenn NDEBUG nicht definiert ist, prüft assert, ob sein Argument(bis C23)der aus __VA_ARGS__ synthetisierte Ausdruck(seit C23) (der skalaren Typ haben muss, andernfalls ist das Verhalten undefiniert) gleich Null ist. Wenn dies der Fall ist, gibt assert implementierungsspezifische Diagnoseinformationen auf dem Standardfehlerausgabe aus und ruft abort() auf. Die Diagnoseinformationen müssen den Text des expression sowie die Werte der vordefinierten Variablen __func__ und der(seit C99) vordefinierten Makros __FILE__ und __LINE__ enthalten.

Inhalt

[bearbeiten] Parameter

condition - expression von skalarem Typ

[bearbeiten] Rückgabewert

(keine)

[bearbeiten] Hinweise

Es gibt keine standardisierte Schnittstelle, um eine zusätzliche Nachricht zu assert-Fehlern hinzuzufügen. Ein portabler Weg, eine einzubinden, ist die Verwendung eines Komma-Operators oder die Verwendung von && mit einem String-Literal.

assert(("There are five lights", 2 + 2 == 5));
assert(2 + 2 == 5 && "There are five lights");

Die Implementierung von assert in der Microsoft CRT entspricht nicht C99 und späteren Revisionen, da ihre zugrunde liegende Funktion (_wassert) weder __func__ noch einen äquivalenten Ersatz erhält.

Obwohl die Änderung von assert in C23 (N2829) kein formeller Fehlerbericht ist, empfiehlt das C-Komitee den Implementierungen, die Änderung in alte Modi zurückzuportieren.

[bearbeiten] Beispiel

#include <stdio.h>
// uncomment to disable assert()
// #define NDEBUG
#include <assert.h>
#include <math.h>
 
#define TEST(...) __VA_ARGS__
 
int main(void)
{
    double x = -1.0;
    assert(x >= 0.0);
    printf("sqrt(x) = %f\n", sqrt(x));
 
    assert(TEST(x >= 0.0));
 
    return 0;
}

Mögliche Ausgabe

--- Output with NDEBUG not defined: ---
a.out: main.cpp:10: main: Assertion `x >= 0.0' failed.
 
--- Output with NDEBUG defined: ---
sqrt(x) = -nan

[bearbeiten] Referenzen

  • C23-Standard (ISO/IEC 9899:2024)
  • 7.2.2.1 Das assert-Makro (S. 196)
  • C17-Standard (ISO/IEC 9899:2018)
  • 7.2.1.1 Das assert-Makro (S. 135)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.2.1.1 Das assert-Makro (S. 186-187)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.2.1.1 Das assert-Makro (S. 169)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.2.1.1 Das assert-Makro

[bearbeiten] Siehe auch

verursacht abnormalen Programmabbruch (ohne Bereinigung)
(Funktion) [bearbeiten]
C++-Dokumentation für assert