2012-09-24 10 views
9

मुझे रिलीज बिल्ड के तहत Q_ASSERT के अर्थशास्त्र पर स्पष्ट विवरण नहीं मिल रहा है। यदि कोई दावा जांच नहीं है, तो क्या ज़ोरदार अभिव्यक्ति का मूल्यांकन किया गया है?Q_ASSERT रिलीज निर्माण semantics

निम्नलिखित कोड

Q_ASSERT(do_something_report_false_if_failed()); 

विल do_something_report_false_if_failed() रन सभी संभावित क्यूटी निर्माण विन्यास के तहत विचार करें? यह सुरक्षित होगा (भले ही थोड़ा अधिक वर्बोज़ और कम पठनीय) इस के बजाय करने के लिए:

bool is_ok = do_something_report_false_if_failed(); 
Q_ASSERT(is_ok) 

बाद दृष्टिकोण नकारात्मक पक्ष यह है कि ASSERT विफलताओं कम वर्बोज़ हैं, लेकिन शायद यह और अधिक स्पष्ट रूप कि बयान है से पता चलता मार डाला?

उत्तर

15

Q_ASSERT के अंदर अभिव्यक्ति गैर-डीबग बिल्ड कॉन्फ़िगरेशन में मूल्यांकन किया जाएगा।

Qt repo से नीचे स्रोत कोड पर विचार करें।

#if !defined(Q_ASSERT) 
# ifndef QT_NO_DEBUG 
# define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop()) 
# else 
# define Q_ASSERT(cond) qt_noop()  
# endif  
#endif 

तो QT_NO_DEBUG परिभाषित किया गया है, तो पूरे Q_ASSERT बयान एक qt_noop() साथ बदल दिया है, जिससे किसी भी अभिव्यक्ति है कि यह पहले से निहित को हटाने।

Q_ASSERT कथन के अंदर एक अभिव्यक्ति द्वारा बनाए गए किसी भी दुष्प्रभाव पर भरोसा न करें। तकनीकी रूप से यह सुनिश्चित करना अभी भी संभव है कि QT_NO_DEBUG किसी विशिष्ट निर्माण कॉन्फ़िगरेशन में परिभाषित नहीं है, लेकिन यह एक अच्छा विचार ™ नहीं है।

+0

यह नियमित रूप से 'जोर' और 'एनडीईबीयूजी' मैक्रो के समान ही स्थिति है। –

14

यह Qt5.5 में अलग हो रहा है (लेकिन पहले - Qt5.4 देखें):

#if !defined(Q_ASSERT) 
# if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS) 
# define Q_ASSERT(cond) do { } while ((false) && (cond)) 
# else 
# define Q_ASSERT(cond) ((!(cond)) ? qt_assert(#cond,__FILE__,__LINE__) : qt_noop()) 
# endif 
#endif 

मैं अब के बहुत सारे हो रही है: दृश्य स्टूडियो में "चेतावनी C4127 सशर्त अभिव्यक्ति स्थिर है" 2013

अद्यतन: Qt5.5 release notes कहते हैं:

Q_ASSERT अब भी रिलीज़ मोड जब में हालत का विस्तार होगा आवेषण अक्षम हैं, यद्यपि एक पहुंच योग्य कोड पथ में। यह वेरिएबल और फ़ंक्शंस के बारे में कंपाइलर चेतावनियों को हल करता है जो रिलीज़ मोड में अप्रयुक्त थे क्योंकि इन्हें केवल दावे में उपयोग किया जाता था। दुर्भाग्य से, कोडफेज जो उन कार्यों और चर को छिपाते हैं #ifndef के माध्यम से क्यूटी 5.5 के साथ संकलित करने के लिए सशर्त को हटाने की आवश्यकता होगी।

+0

Q_ASSERT को फिर से परिभाषित करना और Q_ASSERT_X वापस दोपहर में मदद करता है – user2846246

+2

यह गेरिट में परिवर्तन है: https://codereview.qt-project.org/#/c/94460/3 – Uflex

+0

मुझे एक ही समस्या है। क्या यह क्यूटी संस्करण> 5.5 में तय है? – Knitschi

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