2011-11-16 13 views
6

इस कोड पर एक नज़र डालें:खाली "रिलीज" एएसएसईआरटी मैक्रो क्रैश प्रोग्राम?

#include <cassert> 

#ifdef DEBUG 
#define ASSERT(expr) assert(expr) 
#else 
#define ASSERT(expr) 
#endif /* DEBUG */ 

कार्यक्रम केवल अगर मैं DEBUG परिभाषित किया गया है चलेंगे, अन्यथा यह लटका और बिना किसी परिणाम के समाप्त कर देगा। मैं ग्रहण इंडिगो सीडीटी में मिनजीडब्ल्यू का उपयोग कर रहा हूं। सलाह की सराहना की जाती है!

उत्तर

7

आप लगभग निश्चित रूप से दावाों का दुरुपयोग का दुरुपयोग कर रहे हैं। एक अनुमान अभिव्यक्ति कभी साइड इफेक्ट्स नहीं होना चाहिए।

जब आप कहते हैं, assert(initialize_critical_space_technology());, और फिर आप रिलीज बिल्ड में इस पूरी लाइन को छोड़ देते हैं, तो आप कल्पना कर सकते हैं कि क्या होगा।

const bool space_init = initialize_critical_space_technology(); 
assert(space_init); 

कुछ लोगों को कुछ करने के लिए एक VERIFY मैक्रो परिचय कि हमेशा कोड निष्पादित करता है:

केवल सुरक्षित और समझदार रास्ता कथनों का उपयोग करने के मूल्यों पर है

#define VERIFY(x) (x)   // release 
#define VERIFY(x) (assert(x)) // debug 
8

समस्या उत्पन्न करने वाले वास्तविक कोड को देखे बिना बताना मुश्किल है। मेरा अनुमान है: आप ASSERT() के भीतर साइड इफेक्ट्स के साथ एक अभिव्यक्ति का मूल्यांकन कर रहे हैं। उदाहरण के लिए, ASSERT(++i < someotherthing) एक लूप के साथ। NDEBUG बिल्ड पर केवल expr पर मैक्रो परिभाषा को अस्थायी रूप से संशोधित करके आप पुष्टि कर सकते हैं। इस बात की पुष्टि करने के बाद, प्रत्येक ASSERT कॉल पर जाएं, जिसे आप यह सुनिश्चित करने के लिए जारी कर रहे हैं कि अभिव्यक्ति दुष्प्रभाव मुक्त हैं।

+0

यह शायद दूसरा सबसे है डीबग और रिलीज बिल्ड के बीच अंतर के लिए सामान्य कारण (अनुकूलन के बाद)। –

+0

उत्तर देने के लिए धन्यवाद, सिर्फ एक प्रश्न। गैर-डीबग के लिए केवल '# एस्सेर (एक्सप्रप्रो) (एक्सप्रप्रो)' (जैसा कि केरेक एसबी ने उल्लेख किया था) को परिभाषित करना अच्छा अभ्यास होगा, और वहां से साइड इफेक्ट्स के बारे में चिंता न करें? मुझे एहसास है कि यह मेरे कोड को और अधिक पठनीय बना देगा। – AutoBotAM

+0

@AutoBotam: यदि आप इसके बजाय 'एसेट' 'VERIFY 'कहते हैं, तो सुनिश्चित करें, आगे बढ़ें। लेकिन 'एएसएसईआरटी' को फिर से परिभाषित न करें, लोग जानते हैं और उम्मीद करते हैं कि यह 'एनडीईबीयूजी' बिल्ड पर अभिव्यक्ति का मूल्यांकन न करे। –

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