2015-09-09 2 views
1

J'ai lu dans un texte que placer la ligne de préprocesseur suivante ignore toutes les directives de préprocesseur d'assertion suivantes. Mais cela ne semble pas fonctionner et l'instruction assert est traitée par le préprocesseur et annule le programme lorsque la condition dans l'assert n'est pas satisfaite (je sais que l'abandon est un comportement correct lorsque la condition assert n'est pas satisfaite). Ma question est pourquoi l'instruction assert n'est pas ignorée en plaçant #define NDEBUG. Le code estLe #define NDEBUG ne semble pas fonctionner

#include<stdio.h> 
#include<assert.h> 
#define NDEBUG 

int main(){ 
    int x = 0; 

    assert (x!=0); 

} 

Répondre

1

Définit ne fonctionne pas comme ceci. Vous devez définir votre NDEBUG avant y compris assert.h

Ce qui se passe parce qu'à l'intérieur assert.h NDEBUG est vérifiée à l'aide #ifdef:

#ifdef NDEBUG 
# define assert(expr)   (__ASSERT_VOID_CAST (0)) 
#else 
//.... 
3

Modifier l'ordre d'apparition, il devrait fonctionner:

#define NDEBUG 
#include<assert.h> 

NDEBUG est utilisée pour définir la macro assert() sous <assert.h> sous condition.

0

NDEBUG doit apparaître avant que l'en-tête ne soit inclus. Ceci est exactement spécifié dans la norme.

L'en-tête définit les assert et static_assert macros et fait référence à une autre macro,

 NDEBUG 

qui n'est pas définie par <assert.h>Si NDEBUG est défini comme un nom de macro au point dans la source fichier où <assert.h> est inclus, la macro assert est définie simplement comme

 #define assert(ignore) ((void)0)** 

La macro assert est redéfinie en fonction de l'état actuel de NDEBUG chaque fois que est inclus.

de N1570, emphase mienne.

0

Toutes les réponses précédentes sont correctes.

Mais affirmer ne sont pas destinés à être utilisés en ajoutant #define NDEBUG dans le code source.

La forme canonique:

1) Utilisez #include <assert.h> et appelez assert() dans votre code.

2) Ensuite, au moment de la construction:

2a) gcc blablabla: ceci est un débogage build, NDEBUG n'est pas définie, et assert() entre en action.

2b) gcc blablabla -DNDEBUG blablabla: ceci est une construction production , NDEBUG, assert() ne rien faire.

Les assertions sont un moyen de détecter les erreurs/conditions exceptionnelles au temps de développement. Le NDEBUG pourrait être épelé comme "NOT_DEBUG".