मैंने एक सूचनात्मक आलेख पर ठोकर खाई: http://cnicholson.net/2009/02/stupid-c-tricks-adventures-in-assert/ जिसने मैक्रोज़ मैक्रोज़ के अपने वर्तमान सूट में मौजूद बड़ी संख्या में समस्याओं को इंगित किया।कस्टम सी ++ जोर दें मैक्रो
मैक्रो के अंतिम संस्करण के लिए पूर्ण कोड लेख के अंत के पास दिया जाता है यदि आप लिंक का पालन करें।
के रूप में प्रस्तुत सामान्य रूप (किसी ने मुझसे सही करें अगर मैं इसे सुर में गलत हूँ) इस तरह है:
#ifdef DEBUG
#define ASSERT(cond) \
do \
{ \
if (!(cond)) \
{ \
ReportFailure(#cond, __FILE__, __LINE__, 0); \
HALT(); \
} \
} while(0)
#else
#define ASSERT(cond) \
do { (void)sizeof(cond); } while(0)
जबकि मैं क्या सीखा है के साथ अपने कोड को संशोधित करने के बारे में सोच है, मैं की एक जोड़ी देखा दिलचस्प बदलाव के उस लेख के लिए टिप्पणी में पोस्ट:
एक था कि आप त्रिगुट ऑपरेटर (यानी cond?ASSERT(x):func()
) के साथ इस मैक्रो का उपयोग नहीं कर सकते हैं, और सुझाव के रूप में त्रिगुट ऑपरेटर के साथ if()
और कुछ कोष्ठकों को बदलने के लिए भी था अल्पविराम ऑपरेटर। एक और टिप्पणीकार पर बाद में इस जानकारी का स्रोत:
#ifdef DEBUG
#define ASSERT(x) ((void)(!(x) && assert_handler(#x, __FILE__, __LINE__) && (HALT(), 1)))
#else
#define ASSERT(x) ((void)sizeof(x))
#endif
मैं तार्किक के उपयोग के बारे में सोचा और &&
इस मामले में विशेष रूप से चालाक है और मुझे लगता है इस संस्करण एक if
या यहाँ तक कि त्रिगुट ?:
का उपयोग कर से अधिक लचीला है कि। यहां तक कि अच्छा है कि assert_handler
का वापसी मूल्य यह निर्धारित करने के लिए उपयोग किया जा सकता है कि कार्यक्रम रोकना चाहिए या नहीं। हालांकि मुझे यकीन नहीं है कि यह HALT()
की बजाय (HALT(), 1)
क्यों है।
क्या यहां दूसरे संस्करण के साथ कोई विशेष कमी है जिसे मैंने अनदेखा किया है? यह मैक्रोज़ के चारों ओर लिपटे do{ } while(0)
से दूर है लेकिन यह अनावश्यक लगता है क्योंकि हमें if
से निपटने की आवश्यकता नहीं है।
आपको क्या लगता है?
+1। दिलचस्प लिंक – Maxpm
नीचे मेरा उत्तर भी देखें: http://stackoverflow.com/a/21827201/216063 –