Namespaces
Variants

assert

From cppreference.net
< c ‎ | error
Definiert im Header <assert.h>
#ifdef NDEBUG

#define assert(condition) ((void)0)
#else
#define assert(condition) /*implementation defined*/

#endif
(bis C23)
#ifdef NDEBUG

#define assert(...) ((void)0)
#else
#define assert(...) /*implementation defined*/

#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 als Makroname an der Stelle im Quellcode definiert ist, wo <assert.h> eingebunden wird, 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 der Standardfehlerausgabe aus und ruft abort ( ) auf. Die Diagnoseinformationen müssen den Text von expression sowie die Werte von der vordefinierten Variable __func__ und von (seit C99) den vordefinierten Makros __FILE__ und __LINE__ enthalten.

Inhaltsverzeichnis

Parameter

Bedingung - Ausdruck skalaren Typs

Rückgabewert

(keine)

Hinweise

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

assert(("Es gibt fünf Lichter", 2 + 2 == 5));
assert(2 + 2 == 5 && "Es gibt fünf Lichter");

Die Implementierung von assert im Microsoft CRT entspricht nicht C99 und späteren Revisionen, da ihre zugrundeliegende Funktion ( _wassert ) weder __func__ noch einen äquivalenten Ersatz akzeptiert.

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

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

Referenzen

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

Siehe auch

verursacht abnormale Programmbeendigung (ohne Bereinigung)
(Funktion)