assert
| Défini dans l'en-tête <cassert>
|
||
| Assertion désactivée |
||
#define assert(condition) ((void)0)
|
(1) | (jusqu'à C++26) |
#define assert(...) ((void)0)
|
(depuis C++26) | |
| Assertion activée |
||
#define assert(condition) /* unspecified */
|
(2) | (jusqu'à C++26) |
#define assert(...) /* unspecified */
|
(depuis C++26) | |
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.
NDEBUG est défini comme nom de macro au point du code source où <cassert> ou <assert.h> est inclus, l'assertion est désactivée : assert ne fait rien.|
|
(jusqu'à C++26) |
|
|
(depuis C++26) |
Les informations de diagnostic ont un format défini par l'implémentation, mais elles incluent toujours les informations suivantes :
|
(jusqu'à C++26) |
|
(depuis C++26) |
- le nom du fichier source (c'est-à-dire __FILE__)
- le numéro de ligne source (c'est-à-dire __LINE__)
- le nom de la fonction englobante (c'est-à-dire __func__)
|
L'expression
|
(depuis C++11) |
Paramètres
| condition | - | expression de type scalaire |
Notes
|
Étant donné que
assert(std::is_same_v<int, int>); // error: assert does not take two arguments assert((std::is_same_v<int, int>)); // OK: one argument static_assert(std::is_same_v<int, int>); // OK: not a macro std::complex<double> c; assert(c == std::complex<double>{0, 0}); // error assert((c == std::complex<double>{0, 0})); // OK |
(jusqu'à C++26) |
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
à condition qu'il n'ait pas été
surchargé
, 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 au C++11 et aux révisions ultérieures, car sa fonction sous-jacente (
_wassert
) n'accepte ni
__func__
ni un remplacement équivalent.
Depuis C++20, les valeurs nécessaires pour le message de diagnostic peuvent également être obtenues à partir de std::source_location::current() .
Bien que le changement de
assert
dans C23/C++26 ne soit pas formellement un rapport de défaut, le comité C
recommande
aux implémentations de rétroporter le changement aux anciens modes.
Exemple
#include <iostream> // décommenter pour désactiver assert() // #define NDEBUG #include <cassert> // Utiliser (void) pour ignorer les avertissements de variables inutilisées. #define assertm(exp, msg) assert((void(msg), exp)) int main() { assert(2 + 2 == 4); std::cout << "Point de contrôle #1\n"; assert((void("void aide à éviter l'avertissement 'valeur inutilisée'"), 2 * 2 == 4)); std::cout << "Point de contrôle #2\n"; assert((010 + 010 == 16) && "Une autre façon d'ajouter un message d'assertion"); std::cout << "Point de contrôle #3\n"; assertm((2 + 2) % 3 == 1, "Succès"); std::cout << "Point de contrôle #4\n"; assertm(2 + 2 == 5, "Échec"); // l'assertion échoue std::cout << "L'exécution continue après la dernière assertion\n"; // Aucune sortie }
Sortie possible :
Point de contrôle #1 Point de contrôle #2 Point de contrôle #3 Point de contrôle #4 main.cpp:23: int main(): Assertion `((void)"Échec", 2 + 2 == 5)' failed. Aborted
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 2234 | C++11 |
assert
ne pouvait pas être utilisé dans une expression constante
|
peut être utilisé |
Voir aussi
contract_assert
instruction
(C++26)
|
vérifie une condition interne durant l'exécution |
static_assert
déclaration
(C++11)
|
effectue une vérification d'assertion à la compilation |
|
provoque la terminaison anormale du programme (sans nettoyage)
(fonction) |
|
|
Documentation C
pour
assert
|
|