Namespaces
Variants

assert

From cppreference.net
< c ‎ | error
Défini dans l'en-tête <assert.h>
#ifdef NDEBUG

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

#endif
(jusqu'à C23)
#ifdef NDEBUG

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

#endif
(depuis C23)

La définition de la macro assert dépend d'une autre macro, NDEBUG , qui n'est pas définie par la bibliothèque standard.

Si NDEBUG est défini comme nom de macro au point du code source où <assert.h> est inclus, alors assert ne fait rien.

Si NDEBUG n'est pas défini, alors assert vérifie si son argument (jusqu'en C23) l'expression synthétisée à partir de __VA_ARGS__ (depuis C23) (qui doit avoir un type scalaire, sinon le comportement est indéfini) est égal à zéro. Si c'est le cas, assert affiche des informations de diagnostic spécifiques à l'implémentation sur la sortie d'erreur standard et appelle abort ( ) . Les informations de diagnostic doivent inclure le texte de expression , ainsi que les valeurs de la variable prédéfinie __func__ et des (depuis C99) macros prédéfinies __FILE__ et __LINE__ .

Table des matières

Paramètres

condition - expression de type scalaire

Valeur de retour

(aucun)

Notes

Il n'existe pas d'interface standardisée pour ajouter un message supplémentaire aux erreurs assert . Une méthode portable pour en inclure un est d'utiliser un opérateur virgule , ou d'utiliser && avec un littéral de chaîne :

assert(("Il y a cinq lumières", 2 + 2 == 5));
assert(2 + 2 == 5 && "Il y a cinq lumières");

L'implémentation de assert dans Microsoft CRT n'est pas conforme à C99 et aux révisions ultérieures, car sa fonction sous-jacente ( _wassert ) n'accepte ni __func__ ni un remplacement équivalent.

Bien que le changement de assert en C23 ( N2829 ) ne soit pas un rapport de défaut formel, le comité C recommande aux implémentations de rétroporter le changement aux modes antérieurs.

Exemple

#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;
}

Sortie possible :

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

Références

  • Norme C23 (ISO/IEC 9899:2024):
  • 7.2.2.1 La macro assert (p: 196)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.2.1.1 La macro assert (p: 135)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.2.1.1 La macro assert (p: 186-187)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.2.1.1 La macro assert (p: 169)
  • Norme C89/C90 (ISO/CEI 9899:1990) :
  • 4.2.1.1 La macro assert

Voir aussi

provoque la terminaison anormale du programme (sans nettoyage)
(fonction)