2014-09-02 3 views
0

Je veux imprimer les informations que si _DEBUG est définiimpression que si _DEBUG défini: c

#define DEBUG(y) y == true ? #define _DEBUG true : #define _DEBUG false 

#ifdef _DEBUG 
#define Print(s) printf(s); 
#endif 

Obtenir erreur:

error: '#' is not followed by a macro parameter 

Toute suggestion comment y parvenir avec les directives pré-processeur?

Je l'intention de l'utiliser de mon principal comme:

DEBUG(true); 
Print("Inside main in debug mode"); 
+0

De mon understaning, les déclarations de préprocesseur sont évalués avant de compiler. Ainsi, le prétraitement évaluerait les instructions #Define avant d'appliquer votre logique. @JohnZwinck a la même approche que je prendrais. – Dan

Répondre

0

La première ligne est incorrecte:

#define DEBUG(y) y == true ? #define _DEBUG true : #define _DEBUG false 

Vous ne pouvez pas utiliser #define dans la directive de préprocesseur (comme un autre #define)

Et cela n'a pas de sens, puisque preprocessing arrive avant la compilation réelle (donc avant l'exécution, quand votre y a une certaine valeur). Lire le cpp preprocessor documentation. Rappelons que parfois le préprocesseur est même un programme différent (/lib/cpp) mais est aujourd'hui la première phase de la plupart des compilateurs C.

Vous pouvez demander le formulaire prétraité de votre code source (par exemple avec gcc -C -E source.c > source.i si vous utilisez GCC) et regardez cette forme avec un téléavertisseur (less source.i) ou votre éditeur.

1

I intend to use it from my main as:

DEBUG(y); 
Print("Inside main in debug mode"); 

Désolé, mais ifdef sont compilation (non exécution). Vous pouvez utiliser une vérification globale bool et runtime pour activer et désactiver le débogage.

1

Vous ne pouvez pas créer d'instructions de préprocesseur avec des macros comme vous essayez de le faire; cela ne fonctionne pas et n'est pas autorisé. Pour l'impression conditionnelle, voir C #define macro for debug printing.

2

Essayez ceci:

#ifdef DEBUG 
#define Print(s) printf("%s", s) 
#else 
#define Print(s) 
#endif 

Puis:

#define DEBUG 
Print("Inside main in debug mode"); 
+0

À moins que je ne manque quelque chose ici, cela ne fonctionnera pas. La macro 'Print' sera définie au moment où le premier bloc de code (' #ifdef DEBUG') est analysé, donc appeler '#define DEBUG' ou' #undef DEBUG' avant d'utiliser la macro 'Print' n'aura aucun effet . Autrement dit, ce que 'Print' aura déjà été déterminé au moment où il atteint la ligne' #define DEBUG'. – Cookyt

+0

@Cookyt: Vous avez raison, '#define DEBUG' devra précéder #include de ce qui définit' Print() '. Ou bien la vérification pourrait être faite en une "exécution" (mais peut-être optimisée), sans le préprocesseur du tout. –

5

Vous cannot redéfinissez une macro à run-time. Ni vous pouvez avoir un #define inside of another #define, comme vous essayez dans la première ligne de votre code.

Vous pouvez faire quelque chose comme ceci:

#ifdef _DEBUG 
#define Print(s) printf("%s", s) 
#else 
#define Print(s) 
#endif 

et de l'utiliser à partir de votre principale comme:

#define _DEBUG 
Print("Inside main in debug mode"); 
#undef _DEBUG 
Print("Inside main debug mode off"); 

Si vous avez vraiment besoin de changer de débogage et descendre à l'exécution, votre boîte faire quelque chose comme ceci:

void PrintIf(BOOL dbg, char * msg) 
{ 
    if (dbg) 
    { 
     printf("%s", msg) 
    } 
} 

Et l'utiliser comme ceci

y = TRUE; 
PrintIf(y,"Inside main in debug mode"); 
y = FALSE; 
PrintIf(y,"Inside main debug mode off"); 
1

Le problème se produit ici:

#define DEBUG(y) y == true ? #define _DEBUG true : #define _DEBUG false 

Lors de l'introduction #defines, la définition # se produit au début de la ligne, au plus tard (bien) préprocesseurs permettent généralement un ou deux tirets en ligne) Vous avez besoin. de réécrire votre #define éliminant l'opérateur ternaire simplement:

#ifdef _DEBUG 
#define Print(s) printf(s); 
#endif 

Alors que vous pouvez vous étendre DEFINE avec des macros, vous introduisez souvent des erreurs supplémentaires. Il est généralement préférable de coller à envelopper votre code _DEBUG simplement #ifdef déclarations:

#ifdef _DEBUG 
    fprintf (stderr, "your error messages\n"); // using standard printf/fprintf instead of macros 
    ... 
#endif /* _DEBUG */ 
1

Les macros sont substituées à l'étape de pré-traitement et

#define DEBUG(y) y == true ? #define _DEBUG true : #define _DEBUG false 

cette déclaration seront évalués au moment de la compilation.

L'opérateur conditionnel (opérateur ternaire) est évalué au moment de la compilation. Donc, vous obtenez cette erreur et l'opérateur # doit toujours être utilisé au début de l'instruction qui est la deuxième erreur que vous faites.

Vous pouvez mieux l'utiliser de cette façon

#define DEBUG 
printf ("true"); 
#else 
printf ("false"); 

Vous pouvez également définir cette macro dynamiquement en utilisant l'option gcc -D

gcc -D DEBUG filename.c -o outputFile