46 votes

"#ifdef" à l'intérieur d'une macro

Duplicata possible :
#ifdef inside #define

Comment utiliser le caractère "#" avec succès dans une macro ? Il hurle quand je fais quelque chose comme ça :

#define DO(WHAT)        \
#ifdef DEBUG        \                           
  MyObj->WHAT()         \       
#endif              \

60voto

Roger Lipscombe Points 34344

Vous ne pouvez pas faire ça. Tu dois faire quelque chose comme ça :

#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT) do { } while(0)
#endif

Le site do { } while(0) évite les déclarations vides. Voir cette question par exemple.

10voto

Oli Charlesworth Points 148744

Ça crie parce que tu ne peux pas faire ça.

Je suggère ce qui suit comme alternative :

#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif

5voto

Paul Manta Points 9409

Il semble que ce que vous voulez faire puisse être réalisé de cette manière, sans rencontrer de problèmes :

#ifdef DEBUG
#    define DO(WHAT) MyObj->WHAT()
#else
#    define DO(WHAT) while(false)
#endif

Btw, mieux vaut utiliser le NDEBUG macro, sauf si vous avez une raison plus spécifique de ne pas le faire. NDEBUG est plus largement utilisé comme une macro qui signifie "pas de débogage". Par exemple, la norme assert peut être désactivée en définissant NDEBUG . Votre code deviendrait :

#ifndef NDEBUG
#    define DO(WHAT) MyObj->WHAT()
#else
#    define DO(WHAT) while(false)
#endif

2voto

antlersoft Points 10046

Vous pouvez faire la même chose comme ça :

#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif

2voto

Miguel Points 15459

Pourquoi pas :

#ifdef DEBUG
#define DO(WHAT) MyObj->WHAT()
#else
#define DO(WHAT)
#endif

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X