D'après mes tests, le code suivant génère un avertissement avec -Wall -Wextra -O2 -DNDEBUG
:
int a = func(); // warning: unused variable ‘a’
assert(a != 2);
Mais le code suivant ne le fait pas :
// no warnings
int a;
a = func();
assert(a != 2);
Cependant, vous pouvez toujours supprimer les avertissements concernant les variables inutilisées en les transformant en void
.
int a = func();
(void) a; // suppresses "unused variable" warning
assert(a != 2);
Pour autant que je sache, la ligne a = func()
est toujours considérée comme une utilisation de la variable a
alors que l'initialisation le fait no comptent pour l'utilisation.
Je n'essaierais pas de me prémunir contre l'avenir. possible les avertissements du compilateur au fur et à mesure que les compilateurs évoluent et que leurs diagnostics s'améliorent, étant donné que les couvertures peuvent parfois supprimer accidentellement des avertissements valables.
Comment se définit l'affirmation ?
Les comités de normalisation et les responsables de la mise en œuvre de la norme C ont conçu assert
afin qu'il ne génère pas d'avertissements intempestifs. Notez à quel point les transformations en void
sont...
-
Sans NDEBUG
, la glibc définit assert
grosso modo de la manière suivante (sauf avec quelque chose d'autre que abort
) :
#define assert(expr) ((expr) ? (void) 0 : abort())
-
Con NDEBUG
La glibc le définit de cette manière (comme l'exige la norme C) :
#define assert(expr) ((void) 0)
-
La définition suivante de assert
n'est pas conforme, car il ne se développe pas en une expression :
#define assert(expr) { if (expr) { ... } } // wrong
Les définitions sont également légèrement différentes pour le C++. Vous voyez donc, assert
est défini de la bonne manière, de sorte qu'il ne crée pas de fausses alertes du compilateur, et il se comporte vraiment syntaxiquement comme un appel de fonction.