2012-04-09 17 views
7

मैं डिबग convinience के लिए निम्न मैक्रो लिखने के बारे में शिकायत करते हैं,क्यों संकलक इस मैक्रो घोषणा

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 

लेकिन जीसीसी निम्नलिखित

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

क्या कोड के इस टुकड़े के साथ गलत क्या है के रूप में की शिकायत है? क्या मुझे यहां कुछ महत्वपूर्ण बिंदु याद आते हैं?

+0

आपको एक उत्तर स्पीडमैन स्वीकार करना चाहिए! – gsamaras

उत्तर

18

आपके पास मैक्रो परिभाषा के अंदर #ifdef एस नहीं हो सकता है। आप बाहर अंदर इसे चालू करने की जरूरत है:

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

धन्यवाद। तो मैं डीबग स्विच को नियंत्रित करने के लिए मैक्रो का उपयोग करके लक्ष्य कैसे प्राप्त कर सकता हूं। क्लाइंट एंड में, मैं केवल एक ही पंक्ति को कॉल करना पसंद करता हूं जैसे DEBUG_INFO ("डीबग जानकारी") – speedmancs

+0

@ स्पीडमेनिक्स: मेरा अपडेट किया गया उत्तर देखें। –

+0

+1। इसके अलावा, लाइन 7 के बाद बैकस्लैश है, जो अंतिम पंक्ति में #endif को लाइन 4 का हिस्सा बनने का कारण बनता है, और पहली पंक्ति में #ifndef से मेल नहीं खाता –

1

आप किसी अन्य पूर्वप्रक्रमक निर्देश (DEBUG_INFO की परिभाषा के अंदर #ifdef DEBUG_MODE) में एक पूर्वप्रक्रमक निर्देश एम्बेड नहीं कर सकते। इसके बजाय, जैसे

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

कुछ करना (यह अभी भी आदर्श नहीं है, बचाव की मुद्रा में मैक्रो कोडिंग पता चलता है

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

की तरह कुछ शायद एक inline समारोह बेहतर काम करेगा।)

0

मैं geuss अगर आप खाने के लाइन 7 पर '\', कोड का टुकड़ा काम करेगा।

संबंधित मुद्दे