2012-04-09 16 views
7

piszę następujące makro dla debugowania wygodą,Dlaczego kompilator narzekać tej makro deklaracji

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 

ale gcc narzeka jak następującej

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

Co jest złego w tym kawałku kodu? Czy tęsknię za niektórymi ważnymi punktami tutaj?

+0

Powinieneś zaakceptować odpowiedź speedmancs! – gsamaras

Odpowiedz

18

Nie można mieć wartości #ifdef w definicji makra. Musisz włączyć go na lewą stronę:

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

Dziękuję. Jak więc osiągnąć cel za pomocą makra, aby kontrolować przełącznik debugowania. Na końcu klienta wolę wywoływać tylko jedną linię, np. DEBUG_INFO ("informacje debugowania") – speedmancs

+0

@speedmancs: Zobacz moją zaktualizowaną odpowiedź. –

+0

+1. Po linii 7 występuje odwrotny ukośnik, który powoduje, że #endif w ostatniej linii jest częścią linii 4, i nie pasuje do #ifndef w pierwszej linii –

1

Nie można osadzić dyrektywy preprocesora w innej dyrektywy preprocesora (The #ifdef DEBUG_MODE wewnątrz definicji DEBUG_INFO). Zamiast zrobić coś takiego

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

(to wciąż nie jest idealny; defensywny makro kodowanie sugeruje coś

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

Być może funkcja inline będzie działać lepiej.)

0

I Geuss jeśli jesz "\" w linii 7, kod będzie działał.

Powiązane problemy