Référence du fichier assert.h

aide au débugging Plus de détails...

Macros

#define assert(expression)
 vérifie une condition

Description détaillée

Cet entête fournit la macro assert() qui sert au débugging en permettant de vérifier que les hypothèses faites par le programmeur sont bien vraies.

Il est le seul de la bibliothèque standard du C90 qui puisse être inclu plusieurs fois sans que ce soit équivalent à l'inclure une seule fois. À chaque inclusion, il (re)définit la macro assert() à une valeur qui dépend du fait que NDEBUG soit défini comme nom de macro ou non.


Documentation des macros

#define assert ( expression   ) 

Si l'entête assert.h a été inclu pour la dernière fois alors que NDEBUG était un nom de macro, assert() est défini comme ((void) 0).

Si l'entête assert.h a été inclu pour la dernière fois alors que NDEBUG n'était pas défini en tant que macro, assert() évalue expression, et si le résultat (qui doit être entier) est nul, appelle abort() après avoir écrit sur le flux d'erreur standard des informations sur l'appel qui a échoué (l'expression et sa position telle que décrite avec les valeurs des macros __FILE__ et __LINE__ doivent faire partie du message).

assert() est défini comme étant une expression de type void ce qui autorise des choses comme

if (assert(x > 0), y/x < 12) ...

même si ce genre d'usage n'est pas particulièrement à conseiller, il peut être utile quand on définit une macro.

La macro NDEBUG peut être définie dans le programme par un #define, mais le plus souvent elle est définie sur la ligne de commande du compilateur ou dans les options de l'EDI utilisé. Les programmes devraient être écrit de sorte qu'ils se comportent de la même manière que NDEBUG soit défini ou pas.

Il faut donc réserver assert() à la vérification des pré-conditions, post-conditions et invariants divers. Une assertion qui échoue devrait être le résultat d'une erreur dans le programme. Il ne faut donc pas utiliser assert() pour contrôler la validité des entrées et autres conditions qui peuvent être fausses, même si c'est uniquement suite à une erreur de manipulation: le message généré par assert() est rédigé de façon à aider le programmeur à corriger son programme en l'informant qu'une condition qu'il croyait impossible a été rencontrée, pas à indiquer à l'utilisateur que ses données sont incorrectes.

De même, les expressions vérifiées ne doivent pas avoir des effets de bord qui modifieraient le comportement visible du programme.


Copyright © 2008 -- 2009 Jean-Marc Bourguet Accueil Pages sur le C