assert
macro, , _assert
_wassert
Évalue une expression et, quand le résultat a la valeur false
, imprime un message de diagnostic et interrompt le programme.
Syntaxe
assert(
expression
);
void _assert(
char const* message,
char const* filename,
unsigned line
);
void _wassert(
wchar_t const* message,
wchar_t const* filename,
unsigned line
);
Paramètres
expression
Expression scalaire (expressions de pointeur comprises) évaluée à une valeur différente de zéro (true
) ou égale à zéro (false
).
message
Le message à afficher.
filename
Nom du fichier source où l’assertion a échoué.
line
Numéro de ligne dans le fichier source de l’assertion ayant échoué.
Notes
La macro assert
sert généralement à identifier les erreurs de logique pendant le développement de programme. Vous pouvez l’utiliser pour arrêter l’exécution du programme lorsque des conditions inattendues se produisent en implémentant l’argument expression
pour qu’il soit évalué à false
uniquement quand le programme fonctionne correctement. Vous pouvez désactiver les contrôles d’assertion au moment de la compilation en définissant la macro NDEBUG
. Vous pouvez désactiver la assert
macro sans modifier vos fichiers sources à l’aide d’une /DNDEBUG
option de ligne de commande. Vous pouvez désactiver la assert
macro dans votre code source à l’aide d’une #define NDEBUG
directive avant <assert.h>
d’être incluse.
La assert
macro imprime un message de diagnostic lorsqu’elle prend false
la valeur expression
(0) et appelle abort
pour arrêter l’exécution du programme. Aucune action n'est effectuée si expression
a la valeur true
(différente de zéro). Le message de diagnostic contient l'expression qui a échoué, le nom du fichier source et le numéro de ligne où l'assertion a échoué.
Le message de diagnostic est imprimé en caractères larges (wchar_t
). Par conséquent, il fonctionnera comme prévu même s’il existe des caractères Unicode dans l’expression.
La destination du message de diagnostic dépend du type d'application qui a appelé la routine. Les applications console reçoivent le message via stderr
. Dans une application Windows, assert
appelle la fonction Windows MessageBox
pour créer une boîte de message pour afficher le message avec trois boutons : Abandonner, Réessayer et Ignorer. Si l’utilisateur choisit Abandonner, le programme abandonne immédiatement. Si l’utilisateur choisit Réessayer, le débogueur est appelé et l’utilisateur peut déboguer le programme si le débogage juste-à-temps (JIT) est activé. Si l’utilisateur choisit Ignorer, le programme continuera d’exécuter normalement. Le fait de cliquer sur Ignorer lorsqu’une condition d’erreur existe peut entraîner un comportement non défini, car les conditions préalables du code appelant n’ont pas été remplies.
Pour remplacer le comportement de sortie par défaut quel que soit le type d’application, appelez-le _set_error_mode
pour sélectionner entre le comportement de sortie à stderr et de boîte de dialogue d’affichage.
Après assert
avoir affiché son message, il appelle abort
, qui affiche une boîte de dialogue avec abandon, nouvelle tentative et boutons Ignorer . abort
quitte le programme. Par conséquent, le bouton Réessayer et Ignorer ne reprend pas l’exécution du programme après l’appel assert
. S’il assert
affiche une boîte de dialogue, la abort
boîte de dialogue n’est pas affichée. La seule fois que la abort
boîte de dialogue est affichée, c’est quand elle assert
envoie sa sortie à stderr.
En conséquence du comportement ci-dessus, une boîte de dialogue s’affiche toujours en suivant un assert
appel en mode débogage. Le comportement de chaque bouton est capturé dans le tableau ci-dessous.
Mode d’erreur | Sortie vers stderr (console/_OUT_TO_STDERR ) |
Afficher la boîte de dialogue (Windows/_OUT_TO_MSGBOX ) |
---|---|---|
Abort |
Quitter immédiatement avec le code de sortie 3 | Quitter immédiatement avec le code de sortie 3 |
Retry |
Saut dans le débogueur pendant abort |
Saut dans le débogueur pendant assert |
Ignore |
Terminer la sortie via abort |
Continuer le programme comme s’il assert n’a pas été déclenché (peut entraîner un comportement non défini puisque les conditions préalables du code appelant n’ont pas été remplies) |
Pour plus d’informations sur le débogage CRT, consultez les techniques de débogage CRT.
Les fonctions _assert
et _wassert
sont des fonctions CRT internes. Elles aident à réduire la quantité de code nécessaire dans vos fichiers objet pour prendre en charge les assertions. Nous vous déconseillons d’appeler ces fonctions directement.
La assert
macro est activée dans les versions de mise en production et de débogage des bibliothèques d’exécution C quand NDEBUG
elle n’est pas définie. Quand NDEBUG
elle est définie, la macro est disponible, mais n’évalue pas son argument et n’a aucun effet. Quand elle est activée, la assert
macro appelle _wassert
son implémentation. D’autres macros d’assertion, _ASSERT
_ASSERTE
et , sont _ASSERT_EXPR
également disponibles, mais elles évaluent uniquement les expressions transmises quand la macro a été définie et quand elles sont dans le _DEBUG
code lié à la version de débogage des bibliothèques d’exécution C.
Spécifications
Routine | En-tête requis |
---|---|
assert , _wassert |
<assert.h> |
La signature de la _assert
fonction n’est pas disponible dans un fichier d’en-tête. La signature de la _wassert
fonction est disponible uniquement lorsque la NDEBUG
macro n’est pas définie.
Exemple
Dans ce programme, la fonction analyze_string
utilise la macro assert
pour tester plusieurs conditions liées à la chaîne et à la longueur. Si l'une des conditions échoue, le programme envoie un message indiquant la cause de l'échec.
// crt_assert.c
// compile by using: cl /W4 crt_assert.c
#include <stdio.h>
#include <assert.h>
#include <string.h>
void analyze_string( char *string ); // Prototype
int main( void )
{
char test1[] = "abc", *test2 = NULL, test3[] = "";
printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );
analyze_string( test1 );
printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );
analyze_string( test2 );
printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );
analyze_string( test3 );
}
// Tests a string to see if it is NULL,
// empty, or longer than 0 characters.
void analyze_string( char * string )
{
assert( string != NULL ); // Cannot be NULL
assert( *string != '\0' ); // Cannot be empty
assert( strlen( string ) > 2 ); // Length must exceed 2
}
Le programme génère cette sortie :
Analyzing string 'abc'
Analyzing string '(null)'
Assertion failed: string != NULL, file crt_assert.c, line 25
Après l’échec de l’assertion, en fonction de la version du système d’exploitation et de la bibliothèque d’exécution, vous pouvez voir une boîte de message qui contient quelque chose de similaire à :
A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.
Si un débogueur est installé, sélectionnez le bouton Déboguer pour démarrer le débogueur, ou Fermer le programme pour quitter.
Voir aussi
Gestion des erreurs
Processus et contrôle d’environnement
abort
raise
signal
_ASSERT
, , _ASSERTE
_ASSERT_EXPR
Macros
_DEBUG