जोनाथन का सुझाव अच्छा है लेकिन सी 99 के बाद से हमारे पास विविध मैक्रोज़ हैं इसलिए किसी को डीबग मैक्रो के लिए डबल ब्रेसेस का उपयोग करने की आवश्यकता नहीं है।
प्रवेश हेडर के एक हल्के संस्करण का उपयोग मैं वहाँ जाता है:
#define LOG_FATAL (1)
#define LOG_ERR (2)
#define LOG_WARN (3)
#define LOG_INFO (4)
#define LOG_DBG (5)
#define LOG(level, ...) do { \
if (level <= debug_level) { \
fprintf(dbgstream,"%s:%d:", __FILE__, __LINE__); \
fprintf(dbgstream, __VA_ARGS__); \
fprintf(dbgstream, "\n"); \
fflush(dbgstream); \
} \
} while (0)
extern FILE *dbgstream;
extern int debug_level;
इसलिए आप जहां भी मैं कुछ लॉग इन करने की जरूरत है, मैं तो बस लाइन की तरह
LOG(LOG_ERR, "I/O error %s occured while opening file %s", strerror(errno), filename);
जोड़ने कार्यक्रम initialisation के दौरान आप की जरूरत है dbgstream
के लिए मान निर्दिष्ट करें (आमतौर पर stderr
पर डिफ़ॉल्ट) और debug_level
।
के बजाय वास्तविक परियोजनाओं बुला fprintf
कई बार मैं सिर्फ LOG
मैक्रो से मेरी फ़ंक्शन को कॉल करें और तर्क के रूप में __FILE__
, __LINE__
और __VA_ARGS_
पारित के लिए - कि समारोह भी प्रिंट तिथि, समय और पीआईडी लॉग पंक्ति की, और fflush()
नहीं करते हर बार - केवल जब बफरिंग काउंटर प्रीसेट मान से अधिक हो जाता है - यह महत्वपूर्ण रूप से लॉगिंग प्रदर्शन को बढ़ाता है।
लेकिन कृपया ध्यान रखें कि कुछ कंपाइलर वैरैडिक मैक्रोज़ का समर्थन नहीं कर सकते क्योंकि इसे केवल सी 99 में पेश किया गया था।
इस विषय पर अधिक विचारों के लिए [सी # # डीबग प्रिंटिंग के लिए मैक्रो 'परिभाषित करें] (https://stackoverflow.com/questions/1644868) देखें। चर्चा किसी भी बनाम डीबगिंग/लॉगिंग को संभालने के बारे में अधिक है, लेकिन यह यहां चर्चा की गई बहु-स्तरीय डीबगिंग/लॉगिंग विचारों के लिए कोर बनाती है। –