assert
|
Défini dans l'en-tête
<assert.h>
|
||
|
#ifdef NDEBUG
#define assert(condition) ((void)0)
|
(jusqu'à C23) | |
|
#ifdef NDEBUG
#define assert(...) ((void)0)
|
(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
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) |
|
|
Documentation C++
pour
assert
|
|