जवाबों:
_DEBUG
जब आप /MTd
या /MDd
विकल्प निर्दिष्ट करते हैं तो दृश्य स्टूडियो परिभाषित करता है , NDEBUG
मानक-सी अभिक्रियाओं को निष्क्रिय करता है। उपयुक्त होने पर उनका उपयोग करें, _DEBUG
यदि आप चाहते हैं कि आपका डिबगिंग कोड MS CRT डिबगिंग तकनीकों केNDEBUG
अनुरूप हो और यदि आप संगत होना चाहते हैंassert()
।
यदि आप अपने डिबगिंग मैक्रोज़ को परिभाषित करते हैं (और आप संकलक या सी रनटाइम को हैक नहीं करते हैं), तो अंडरस्कोर के साथ नाम शुरू करने से बचें, क्योंकि ये आरक्षित हैं।
क्या NDEBUG मानक है?
हाँ यह C89, C99, C ++ 98, C ++ 2003, C ++ 2011, C ++ 2014 मानकों के लिए अर्थ "नॉट डीबग" के साथ एक मानक मैक्रो है। _DEBUG
मानकों में कोई मैक्रोज़ नहीं हैं।
सी ++ 2003 मानक "17.4.2.1 हेडर" मानक सी पर "पेज 326" पर पाठक को भेजें।
यह NDEBUG मानक C लाइब्रेरी के समान है।
C89 में (C प्रोग्रामर ने इस मानक को मानक C के रूप में कहा जाता है) "4.2 DIAGNOSTICS" खंड में यह कहा गया था
http://port70.net/~nsz/c/c89/c89-draft.html
यदि NDEBUG को स्रोत फ़ाइल में उस बिंदु पर एक स्थूल नाम के रूप में परिभाषित किया गया है जहां शामिल है, तो एस्टर मैक्रो को केवल उसी रूप में परिभाषित किया गया है
#define assert(ignore) ((void)0)
यदि _DEBUG
मैक्रोज़ के दृश्य स्टूडियो में
देखें
।
मैं भरोसा करता हूं NDEBUG
, क्योंकि यह एकमात्र ऐसा व्यवहार है जिसका व्यवहार संकलक और कार्यान्वयन में मानकीकृत है (मानक मुखर मैक्रो के लिए प्रलेखन देखें)। नकारात्मक तर्क एक छोटी पठनीयता गति है, लेकिन यह एक सामान्य मुहावरा है जिसे आप जल्दी से अपना सकते हैं।
कुछ पर भरोसा करने _DEBUG
के लिए एक विशेष संकलक और पुस्तकालय कार्यान्वयन के कार्यान्वयन विवरण पर भरोसा करना होगा। अन्य संकलक समान सम्मेलन का चयन कर सकते हैं या नहीं भी कर सकते हैं।
तीसरा विकल्प अपनी परियोजना के लिए अपने स्वयं के मैक्रो को परिभाषित करना है, जो काफी उचित है। अपना मैक्रो होने से आपको क्रियान्वयन में पोर्टेबिलिटी मिलती है और यह आपको स्वतंत्र रूप से अभिकथन के साथ अपने डिबगिंग कोड को सक्षम या अक्षम करने की अनुमति देता है। हालांकि, सामान्य तौर पर, मैं डिबगिंग जानकारी के विभिन्न वर्गों के बारे में सलाह देता हूं जो संकलन के समय सक्षम हैं, क्योंकि यह यकीनन छोटे लाभ के लिए आपके द्वारा बनाए गए कॉन्फ़िगरेशन (और परीक्षण) की संख्या में वृद्धि का कारण बनता है।
इनमें से किसी भी विकल्प के साथ, यदि आप अपनी परियोजना के हिस्से के रूप में तीसरे पक्ष के कोड का उपयोग करते हैं, तो आपको यह जानना होगा कि यह किस कन्वेंशन का उपयोग करता है।
#if !defined(NDEBUG)
<- @HostileFork यह नहीं है कि आपका क्या मतलब है? #if
नहीं #ifdef
?
#ifdef NDEBUG
... लेकिन तब के साथ नकारात्मक तर्क पर विशेष ध्यान दें #if !defined(NDEBUG)
। अन्यथा #ifndef NDEBUG
" एन में पकड़ना थोड़ा कठिन है "
मैक्रो NDEBUG
नियंत्रित करता है कि क्याassert()
कथन सक्रिय हैं या नहीं।
मेरे विचार में, यह किसी भी अन्य डिबगिंग से अलग है - इसलिए मैं NDEBUG
प्रोग्राम में डीबगिंग जानकारी को नियंत्रित करने के अलावा कुछ और का उपयोग करता हूं । मैं जो उपयोग करता हूं वह भिन्न होता है, उस रूपरेखा के आधार पर, जिसके साथ मैं काम कर रहा हूं; विभिन्न प्रणालियों में अलग-अलग सक्षम करने वाले मैक्रोज़ होते हैं, और मैं जो भी उपयुक्त होता है उसका उपयोग करता हूं।
यदि कोई ढांचा नहीं है, तो मैं एक प्रमुख अंडरस्कोर के बिना एक नाम का उपयोग करूंगा; उन लोगों को 'कार्यान्वयन' के लिए आरक्षित किया जाता है और मैं नाम के टकराव के साथ समस्याओं से बचने की कोशिश करता हूं - दोगुना इसलिए जब नाम एक मैक्रो है।
#if
दूसरे में -कंट्रोल कोड के समान नहीं है । assert(huge_object.IsValid());
जबकि assert(ptr != nullptr);
शायद नहीं है धीमा हो सकता है। मैं जोनाथन के साथ सहमत हूं कि लॉगिंग और ट्रेसिंग संभवतः कथनों से अलग होनी चाहिए, कम से कम बड़ी परियोजनाओं में, लेकिन मैं डिबग कोड के रूप में लॉगिंग या ट्रेसिंग के बारे में नहीं सोचता , यही कारण है कि मैंने स्पष्टीकरण के लिए कहा।
दुर्भाग्य DEBUG
से अत्यधिक भार है। उदाहरण के लिए, यह हमेशा बनाने और RELEASE बनाता है के लिए एक pdb फ़ाइल को बचाने के लिए सिफारिश की है। जिसका मतलब -Zx
झंडे में से एक है , और -DEBUG
लिंकर विकल्प। जबकि _DEBUG
रनटाइम लाइब्रेरी के विशेष डिबग संस्करणों जैसे कि कॉल टू malloc
और से संबंधित है free
। फिर NDEBUG
दावे को अक्षम कर देगा।