2012-02-10 11 views
10

मानक सी जोर मैक्रो अक्षम है जब मैक्रो NDEBUG परिभाषित किया गया है, जिसका अर्थ है "डीबग नहीं"। यह #ifndef NDEBUG //DebuggingCode #endif जैसे वास्तव में भयानक डबल नकारात्मक मामलों की ओर जाता है। ऐसा लगता है कि रिलीज शर्तों की बेहतर पसंद होगी, लेकिन मुझे विश्वास नहीं है कि मानकों की समिति ने ऐसा करने के किसी कारण के बिना ऐसा किया होगा ....रिलीज के बजाय एनडीईबीयूजी क्यों?

+8

'एनडीईबीयूजी 'का मतलब है * कोई डीबग * नहीं। 'रिलीज 'अधिक मतलब हो सकता है। – cnicutar

+1

"डीबग"/"डीबग नहीं" के पास कुछ प्रोग्रामिंग वातावरण के लिए कुछ अर्थ है। "रिलीज"/"रिलीज सॉफ़्टवेयर"/"रिलीज करना" पूरी तरह से अलग वार्तालाप है जो आपके द्वारा कंपाइलर झंडे चुनने के बाद लंबे समय तक होता है। –

+0

'#if परिभाषित (रिलीज)' '# परिभाषित करें NDEBUG'' else' '#undef NDEBUG'' endif' – pmg

उत्तर

5

मैक्रो रिलीज होने का मतलब है कि कोड वितरण के लिए तैयार है - जब यह नहीं हो सकता है। दूसरी तरफ एनडीईबीयूजी का तात्पर्य है कि डिबगिंग पूर्ण है, इसलिए परीक्षण के लिए तैयार है।

मुझे यह भी लगता है कि चीज़ों को बंद करना बेहतर है यह सुनिश्चित करने के लिए कि आपने सब कुछ चालू कर दिया है। यही कारण है कि अधिकांश ओएस (उदाहरण के लिए) ज्यादातर चीज़ों पर स्विच किया जाता है जब बहुत से लोगों को इसकी आवश्यकता नहीं होती है।

बस मेरे विनम्र विचार।

5

मैक्रो NDEBUG नियंत्रित करता है कि कैसे assert व्यवहार करते हैं।

आपको आमतौर पर इसे किसी अन्य चीज़ के लिए उपयोग नहीं करना चाहिए। यदि आप इसे अन्य चीजों के लिए उपयोग करेंगे, जैसे कि अतिरिक्त डीबग ट्रेस आउटपुट, आपके पास इस अतिरिक्त कोड के बिना अपना एप्लिकेशन बनाने का विकल्प नहीं है लेकिन दावे सक्षम हैं।

मैं अनुशंसा करता हूं कि आप अपना खुद का प्रीप्रोसेसर प्रतीक परिभाषित करें, MY_TRACE कहें, और इसका उपयोग करें। इसके अलावा, इसे 0 या 1 पर परिभाषित करें और #if MY_TRACE का उपयोग करें। इस तरह आप प्रीप्रोसेसर अभिव्यक्ति में एक अनियमित चर का उपयोग करते समय चेतावनी जारी करने के लिए अपने कंपाइलर को कॉन्फ़िगर करने के लिए सही ढंग से प्रारंभ किए बिना प्रतीक का उपयोग करके फ़ाइलों को पकड़ सकते हैं।

+1

मुझे इसका उपयोग किसी और चीज़ के लिए क्यों नहीं करना चाहिए? –

+4

ठीक है, अगर आप इसे किसी अन्य चीज़ के लिए उपयोग नहीं करते हैं लेकिन 'जोर' को नियंत्रित करते हैं, तो आपको कभी भी '#ifndef NDEBUG' लिखने की आवश्यकता नहीं होगी। – Lindydancer

+2

क्या होता है जब आपको दुर्लभ हार्ड-टू-रीप्रोडस बग को ट्रैक करने के लिए 'जोरदार सक्षम' छोड़ने की आवश्यकता होती है, लेकिन नहीं चाहते कि हजारों लाइनों को डीबग आउटपुट को जगह पर फेंक दिया जाए? –

3

मेरा मानना ​​है कि नहीं कर सकते मानक समिति होगा ऐसा करने के लिए किसी कारण के बिना [assert() को नियंत्रित करने के नाम NDEBUG उपयोग के लिए चुना] है ....

मैं केवल अनुमान लगा सकते हैं, लेकिन मैं संदेह है कि मैक्रोज़ पर काम करने के तरीके को नियंत्रित करने के लिए पूर्व-मानक कई कार्यान्वयनों द्वारा उपयोग किए जाने वाले कई अलग-अलग नाम हो सकते हैं, और समिति ने संभवतः 'तटस्थ' नाम चुनने का निर्णय लिया जो कुछ असंबद्ध कारणों के लिए मौजूदा कोड में उपयोग की जाने वाली कुछ संभावना नहीं थी । मुझे लगता है कि RELEASE के लिए कोड के उचित बिट में मैक्रो के रूप में उपयोग करने के लिए यह आम बात हो सकती है, इसलिए assert() मैक्रो को नियंत्रित करने के लिए उस नाम (या DEBUG) का उपयोग करके विवाद हो सकता है (विशेष रूप से उन उपयोगकर्ताओं के लिए जो ठीक नियंत्रण चाहते हैं दावा, उन्हें केवल कोड के हिस्सों के लिए बदलना)।

0

लंबी अवधि के एफिल उपयोगकर्ता के रूप में मैं आपको बता सकता हूं कि इसे किसी अन्य तरीके से डीबग/नोडबग में उपयोग किया जाता है। जैसा कि इंगित किया गया है कि केवल एक ही प्रभाव है जोरदार बयान को अक्षम करना। जोर देने का उद्देश्य प्री-और पोस्टकंडिशन चेक जोड़ना है। इसका उपयोग करने की सिफारिश की जाती है, और यह आपके प्रोग्राम के प्रदर्शन को 10 या उससे अधिक कारकों से धीमा कर सकता है। इसे अनुबंध द्वारा डिजाइन (गरीब पुरुषों) कहा जाता है।

एनडीईबीयूजी का उपयोग करते समय इसका मतलब यह नहीं है कि आप डिबगिंग के साथ समाप्त हो गए हैं, बस यह भारी डीबगिंग उपकरण हटा दिया गया है।

लोकप्रिय डीबग/रिलीज दुर्भाग्यवश व्यावहारिक विकास में सबसे अच्छा मामला नहीं है जहां आपने अच्छे कारणों से अल्फा, बीटा, रिलीज रिलीज मॉडल का सामना किया है।

अल्फा सॉफ़्टवेयर में इतना गड़बड़ है कि आप इसे एनडीईबीयूजी और डीबगर प्रतीकों के बिना संकलित करते हैं। बीटा एनडीईबीयूजी सेट और डीबगर प्रतीकों (और शायद पहले से ही ऑप्टिमाइज़ेशन स्विच के साथ) के साथ संकलित है और अंतिम रिलीज को एनडीईबीयूजी और पूर्ण अनुकूलन के साथ संकलित किया जाता है।

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