assert (macro), _assert, _wassert

 

Date de publication : novembre 2016

Pour obtenir la dernière documentation sur Visual Studio 2017 RC, consultez Documentation Visual Studio 2017 RC.

Évalue une expression et, quand le résultat a la valeur false, imprime un message de diagnostic et interrompt le programme.

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
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é.

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 macro assert sans modifier vos fichiers source à l’aide de l’option de ligne de commande /DNDEBUG . Vous pouvez désactiver la assert macro dans votre code source en utilisant un #define NDEBUG directive avant <assert.h>est inclus.</assert.h>

La macro assert affiche un message de diagnostic lorsque expression est évalué à false (0) et appelle abort pour terminer 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. Ainsi, la procédure fonctionne comme prévu même si l'expression contient des caractères Unicode.

La destination du message de diagnostic dépend du type d'application qui a appelé la routine. Les applications console reçoivent toujours 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 un bouton OK . Lorsque l'utilisateur clique sur OK, le programme s'interrompt immédiatement.

Lorsque l'application est liée à une version debug des bibliothèques Runtime, assert crée un message avec trois boutons : Abandonner, Réessayeret Ignorer. Si l'utilisateur clique sur Abandonner, le programme s'interrompt immédiatement. Si l'utilisateur clique sur 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 clique sur Ignorer, assert poursuit son exécution normale en créant la boîte de message avec le bouton OK . Notez que lorsque vous cliquez sur Ignorer alors qu'une condition d'erreur existe, un comportement non défini peut se produire.

Pour plus d'informations sur le débogage CRT, consultez 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 macro assert est activée dans les versions Release et Debug des bibliothèques Runtime C lorsque NDEBUG n’est pas défini. Lorsque NDEBUG est défini, la macro est disponible mais n’évalue pas son argument et n’a aucun effet. Lorsqu’elle est activée, la macro assert appelle _wassert pour son implémentation. D’autres macros d’assertion, _ASSERT, _ASSERTE et _ASSERT_EXPR, sont également disponibles, mais elles évaluent seulement les expressions qui leur sont passées lorsque la macro _DEBUG a été définie et lorsqu’elles sont dans du code lié à la version Debug des bibliothèques Runtime C.

RoutineEn-tête requis
assert, _wassert<assert.h>

La signature de la fonction _assert n’est pas disponible dans un fichier d’en-tête. La signature de la fonction _wassert est disponible uniquement lorsque la macro NDEBUG n’est pas définie.

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 d’assertion, en fonction de la version du système d’exploitation et de la bibliothèque Runtime, vous pouvez voir une boîte de message contenant du texte semblable à celui-ci :

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.

System::Diagnostics::Debug :: Assert

Gestion des erreurs
Processus de contrôle et d’environnement
abandonner
déclencher
signal
_ASSERT, _ASSERTE, macros _ASSERT_EXPR
_DEBUG

Afficher: