Share via


assertmacro, , _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