मैं अपने सी # एप्लिकेशन में लॉगिंग या ट्रेसिंग जोड़ना चाहता हूं, लेकिन मैं नहीं चाहता कि स्ट्रिंग या गणना मूल्यों को स्वरूपित करने का ओवरहेड लॉग हो, यदि लॉग वर्बोजिटी स्तर इतना कम सेट किया गया है कि संदेश होगा लॉग इन नहीं किया गयासी # सशर्त लॉगिंग/ट्रेसिंग
#define VLOG(level,expr) if (level >= g_log.verbosity) { g_log.output << expr; }
इस तरह उपयोग किया::
VLOG(5,"Expensive function call returns " << ExpensiveFunctionCall());
कैसे आप ऐसा करते
सी ++ में, आप मैक्रो कि सभी इस तरह क्रियान्वित किया जा रहा से कोड पाएगा परिभाषित करने के लिए पूर्वप्रक्रमक उपयोग कर सकते हैं सी # में?
मैं ट्रेस और डीबग सुविधाओं here समझा माइक्रोसॉफ्ट डॉक्स पढ़ा है, और वे दावा करते हैं कि #undef डीबग और #undef ट्रेस का उपयोग कर निष्पादन का उत्पादन से सभी अनुरेखण और डिबगिंग कोड निकालता है, लेकिन यह वास्तव में पूरे कॉल को दूर करता है ? मतलब, अगर मैं
System.Diagnostics.Trace.WriteLineIf(g_log.verbosity>=5,ExpensiveFunctionCall());
यदि मैं ट्रेसी को परिभाषित करता हूं तो यह मेरा महंगा कार्य नहीं करेगा? या कॉल करता है, तो तय करता है कि यह कुछ भी पता नहीं लगाएगा?
वैसे भी, अगर यह इसे हटा देता है, तो यह सी ++ मैक्रो से भी कम है क्योंकि मैं उस बड़ी बदसूरत कॉल को सी ++ में अपने सरल VLOG() कॉल की तरह नहीं देख सकता और फिर भी पैरामीटर का मूल्यांकन करने से बच सकता हूं, क्या मैं कर सकता हूं? न ही मैं रनटाइम पर कम वर्बोजिटी को परिभाषित करके ओवरहेड से बच सकता हूं जैसे कि मैं सी ++ में कर सकता हूं, है ना?
लंबे उपसर्ग बदसूरत हिस्सा नहीं है, लेकिन तथ्य यह है कि मुझे g_log.verbosity और यहां तक कि फ़ंक्शन नाम WriteLine का खुलासा करना है। मैं अपना स्वयं का कार्य VLOG (5, ...) करना चाहता हूं। –