2012-04-09 23 views
7

escribo la siguiente macro para conveniencia de depuración,Por qué compilador se quejan de esta declaración macro

1 #ifndef DEF_H 
2 #define DEF_H 
3 #define DEBUG_MODE 
4 #define DEBUG_INFO(message)  \ 
5   #ifdef DEBUG_MODE  \ 
6     cout << message << endl; \ 
7   #endif       \ 
8 #endif 

pero gcc se queja de la siguiente manera

def.h:4: error: '#' is not followed by a macro parameter 
def.h:1: error: unterminated #ifndef 

¿Qué pasa con este pedazo de código? ¿Extraño algunos puntos importantes aquí?

+0

¡Debe aceptar una respuesta speedmancs! – gsamaras

Respuesta

18

No puede tener #ifdef s dentro de una definición de macro. Es necesario a su vez al revés:

#ifdef DEBUG_MODE 
#define DEBUG_INFO(message) cout << (message) << endl 
#else 
#define DEBUG_INFO(message) 
#endif 
+0

Gracias. Entonces, ¿cómo puedo lograr el objetivo usando macro para controlar el interruptor de depuración? En el extremo del cliente, prefiero llamar a una sola línea como DEBUG_INFO ("información de depuración") – speedmancs

+0

@speedmancs: ver mi respuesta actualizada. –

+0

+1. Además, hay una barra invertida después de la línea 7, que causa que el #endif en la última línea sea parte de la línea 4, y no coincida con el #ifndef en la primera línea –

1

No se puede incrustar una directiva de preprocesador en otra directiva de preprocesador (el #ifdef DEBUG_MODE dentro de la definición de DEBUG_INFO). En su lugar, hacer algo como

#ifdef DEBUG_MODE 
# define DEBUG_INFO(message) cout << message << endl 
#else 
# define DEBUG_INFO(message) 0 
#endif 

(Esto todavía no es ideal; defensiva codificación macro sugiere algo así como

#ifdef DEBUG_MODE 
# define DEBUG_INFO(message) do {cout << message << endl;} while (0) 
#else 
# define DEBUG_INFO(message) 0 
#endif 

Tal vez una función inline funcionaría mejor.)

0

I geuss si come '\' en la línea 7, la pieza de Code funcionará.

Cuestiones relacionadas