सी ++ में दावा कैसे किए जाते हैं? उदाहरण कोड की सराहना की जाती है।दावे क्या हैं? और आप उनका उपयोग क्यों करेंगे?
उत्तर
आवेषण स्पष्ट रूप से उन मान्यताओं की जांच करने का एक तरीका है जो आपका कोड बनाता है, जो आपको संभावित समस्याओं का समाधान करके बहुत सारी बगों को ट्रैक करने में मदद करता है। उन्हें आमतौर पर केवल आपके एप्लिकेशन के विशेष "डीबग" निर्माण में मूल्यांकन किया जाता है, इसलिए वे अंतिम रिलीज़ संस्करण को धीमा नहीं करेंगे।
मान लें कि आपने एक ऐसा फ़ंक्शन लिखा है जो एक पॉइंटर को तर्क के रूप में लेता है। एक अच्छा मौका है कि आपका कोड यह मान लेगा कि पॉइंटर गैर-नल है, तो स्पष्ट रूप से किसी दावे के साथ जांच क्यों न करें?
#include <assert.h>
void function(int* pointer_arg)
{
assert(pointer_arg != NULL);
...
}
नोट करने के लिए एक महत्वपूर्ण बात यह है कि भाव तो आपको यह स्पष्ट दुष्प्रभाव हो नहीं करना चाहिए, क्योंकि वे रिलीज निर्माण में मौजूद नहीं होगा: यहाँ कैसे। तो इस तरह कुछ ऐसा न करें:
assert(a++ == 5);
कुछ लोग भी उन्हें अपने अर्थों में छोटे संदेश जोड़ना पसंद करते हैं ताकि उन्हें अर्थ देने में मदद मिल सके। के बाद से एक स्ट्रिंग हमेशा सच करने के लिए evaulates, तो आप इस लिख सकते हैं:
assert((a == 5) && "a has the wrong value!!");
दावा बूलियन अभिव्यक्तियां हैं जो आम तौर पर हमेशा सत्य होना चाहिए।
उनका उपयोग यह सुनिश्चित करने के लिए किया जाता है कि आप क्या उम्मीद करते हैं।
void some_function(int age)
{
assert(age > 0);
}
आप उम्र से निपटने के लिए, आप भी 'पता' पक्का आप हमेशा समझदार तर्क गुजर रहे हैं, तो आप एक ज़ोर का उपयोग समारोह लिखा था। यह कहने जैसा है "मुझे पता है कि यह कभी गलत नहीं हो सकता है, लेकिन अगर ऐसा होता है, तो मैं जानना चाहता हूं", क्योंकि, ठीक है, हर कोई गलती करता है।
तो समझदार उपयोगकर्ता इनपुट की जांच नहीं करना है, अगर परिदृश्य है जहां कुछ गलत हो सकता है, तो एक जोर का उपयोग न करें। असली जांच करें और त्रुटियों से निपटें।
आवेषण आमतौर पर केवल डीबग बिल्ड के लिए होते हैं, इसलिए आवेषण में साइड इफेक्ट्स के साथ कोड न डालें।
एक दावा वह है जो आप अपने प्रोग्राम में जोड़ते हैं जो किसी शर्त को पूरा होने पर प्रोग्राम को तुरंत बंद करने का कारण बनता है, और एक त्रुटि संदेश प्रदर्शित करता है। आप आम तौर पर उन चीज़ों के लिए उनका उपयोग करते हैं जिन्हें आप मानते हैं कि आपके कोड में कभी नहीं हो सकता है।
यहाँ एक अभिकथन है और here कुछ नमूना कोड है की एक definition है। संक्षेप में, एक धारणा किसी डेवलपर के किसी भी बिंदु पर कोड की स्थिति के बारे में उसकी (या उसकी) धारणाओं का परीक्षण करने का एक तरीका है। उदाहरण के लिए, आप निम्न कोड कर रहे थे, तो: - कि mypointer कॉल करने से पहले शून्य कभी नहीं होगा
mypointer->myfunct();
आप शायद कि mypointer बात पर जोर देना चाहते हैं शून्य क्योंकि है कि आपके धारणा है नहीं है।
दावा ऐसे विवरण हैं जो आपको अपने कार्यक्रम में होने वाली किसी भी धारणा का परीक्षण करने की अनुमति देते हैं। यह विशेष रूप से आपके प्रोग्राम तर्क (पूर्व शर्त और पोस्टकंडिशन) दस्तावेज करने के लिए उपयोगी है। असफलताएं जो विफल होती हैं आमतौर पर रनटाइम त्रुटियों को फेंकती हैं, और संकेत हैं कि आपके प्रोग्राम के साथ कुछ गलत है - आपका दावा विफल हुआ क्योंकि कुछ ऐसा जो आपने सच माना था वह नहीं था। सामान्य कारण हैं: आपके फ़ंक्शन के तर्क में कोई दोष है, या आपके फ़ंक्शन के कॉलर ने आपको खराब डेटा पास कर दिया है।
आमतौर पर इनपुट मानकों और रिटर्न परिणामों के संदर्भ में डिज़ाइन धारणाओं को सत्यापित करने के लिए सम्मिलन का उपयोग किया जाता है। उदाहरण के लिए
// Given customer and product details for a sale, generate an invoice
Invoice ProcessOrder(Customer Cust,Product Prod)
{
assert(IsValid(Cust));
assert(IsValid(Prod);
'
'
'
assert(IsValid(RetInvoice))
return(RetInvoice);
}
कोड चलाने के लिए जोर देने की कथन की आवश्यकता नहीं है, लेकिन वे इनपुट और आउटपुट की वैधता की जांच करते हैं। अगर इनपुट अमान्य है, तो कॉलिंग फ़ंक्शन में एक बग है। यदि इनपुट मान्य है और आउटपुट अमान्य है, तो इस कोड में एक बग है। आवेषण के इस उपयोग के अधिक विवरण के लिए design by contract देखें।
संपादित करें: जैसा कि अन्य पदों में बताया गया है, रिलीज रन-टाइम में जोर देने का डिफ़ॉल्ट कार्यान्वयन शामिल नहीं है। एक आम अभ्यास जो कि कई लोग स्वयं का उपयोग करेंगे, इसे रिलीज़ बिल्ड में शामिल संस्करण के साथ प्रतिस्थापित करना है, लेकिन इसे केवल डायग्नोस्टिक्स मोड में ही बुलाया जाता है। यह पूर्ण आकलन जांच के साथ रिलीज बिल्ड पर उचित प्रतिगमन परीक्षण सक्षम बनाता है। मेरा संस्करण निम्नानुसार है;
extern void _my_assert(void *, void *, unsigned);
#define myassert(exp) \
{ \
if (InDiagnostics) \
if (!(exp)) \
_my_assert(#exp, __FILE__, __LINE__); \
} \
इस तकनीक में एक छोटा सा क्रम भूमि के ऊपर नहीं है, लेकिन यह किसी भी कीड़े है कि यह क्षेत्र में बहुत आसान बना दिया है पर नज़र रखने में आता है।
"नहीं हो सकता" स्थितियों की जांच के लिए दावाों का उपयोग करें।
विशिष्ट उपयोग: फ़ंक्शन के शीर्ष पर अमान्य/असंभव तर्कों के विरुद्ध जांचें।
शायद ही कभी देखा गया, लेकिन अभी भी उपयोगी: लूप इनवेरिएंट्स और पोस्टकंडिशन।
यह ज़ोर सुविधा है जो जल्दी सी दिनों से हमारे लिए नीचे आ गया है पता नहीं है, लेकिन आप भी Boost StaticAssert कार्यक्षमता के बारे में पता होना चाहिए, घटना में है कि अपनी परियोजनाओं को बूस्ट का उपयोग कर सकता है।
मानक सी/सी ++ जोर रनटाइम के दौरान काम करता है। बूस्ट स्टेटिकएस्र्ट सुविधा आपको संकलन समय पर कुछ वर्गों के दावे करने, तर्क त्रुटियों को पकड़ने और पहले की तरह भी करने में सक्षम बनाता है।
- 1. अभिव्यक्ति पेड़ क्या हैं, आप उनका उपयोग कैसे करते हैं, और आप उनका उपयोग क्यों करेंगे?
- 2. कोड अनुबंध, क्या आप उनका उपयोग करेंगे?
- 3. सी में आंतरिक स्थैतिक चर, क्या आप उनका उपयोग करेंगे?
- 4. क्या आप दावे का उपयोग करते हैं?
- 5. एब्स्ट्रैक्ट क्लास और इंटरफेस क्या है और आप PHP में उनका उपयोग कब करेंगे?
- 6. PHP निर्माण/एकीकरण उपकरण: क्या आप उनका उपयोग करते हैं?
- 7. आप कब और क्यों अपाचे कॉमन्स-डायजेस्टर का उपयोग करेंगे?
- 8. आप कई पतले सर्वर क्यों शुरू करेंगे?
- 9. क्या आप क्यूटी का उपयोग करते हैं और आप इसका उपयोग क्यों करते हैं?
- 10. इन आईआईएस बाध्यकारी क्या हैं और उनका उद्देश्य क्या है?
- 11. आप PHP में $ _GET और $ _POST क्यों विलय करेंगे?
- 12. कब और क्यों आप कक्षा को सील करेंगे?
- 13. आप किसी शर्त में असाइनमेंट का उपयोग क्यों करेंगे?
- 14. आप बेस क्लास सदस्य क्यों मुखौटा करेंगे?
- 15. आप लंबित इन्टेंट का उपयोग कब करेंगे?
- 16. आप गेटर्स और सेटर्स विधि को निजी क्यों घोषित करेंगे?
- 17. वेब विकास के लिए आप क्या उपयोग करते हैं और आप इसे चट्टान क्यों सोचते हैं?
- 18. सी #: आभासी घटनाएं क्या हैं और उनका उपयोग कैसे किया जा सकता है?
- 19. जावा में तैनाती स्क्रिप्ट के लिए आप क्या उपयोग करेंगे?
- 20. क्या आप लॉक ऑर्डरिंग की व्याख्या करेंगे?
- 21. आप (और क्यों) विरोधाभासों का उपयोग करते हैं?
- 22. एसिंक और प्रतीक्षा क्या है और आप इन्हें विंडोज़ विकास में कब उपयोग करेंगे?
- 23. आप IGNORE_DUP_KEY को चालू क्यों नहीं सेट करेंगे?
- 24. static_assert क्या करता है, और आप इसके लिए क्या उपयोग करेंगे?
- 25. XSD.EXE दो .XSD फ़ाइलें क्यों बनाते हैं, और उनका उपयोग कैसे करें?
- 26. कोको में एक प्रतिनिधि क्या है और मुझे उनका उपयोग क्यों करना चाहिए?
- 27. क्या आप एनडपेन्स का उपयोग करते हैं?
- 28. कारखानों को समझना और क्या मुझे उनका उपयोग करना चाहिए?
- 29. विलय मॉड्यूल क्या हैं और उनका उपयोग कैसे किया जाता है?
- 30. हस्ताक्षरित कुकीज़ क्या हैं और वे क्यों उपयोगी हैं?
मैंने पहले एक स्ट्रिंग के साथ एंडिंग नहीं देखा है। असली उपयोगी! –
उस प्रकार की चाल (या एक समान भिन्नता) का प्रयोग पर्ल-भूमि में हर समय किया जाता है, अर्थात्, उदाहरण के प्रयोग से: a == 5 || मरें ("एक गलत मूल्य है"); ढीले बूलियन टाइपिंग के लिए Hurray। –
रिलीज कोड में मानों को मान्य करते समय, इस स्ट्रिंग की लाइनों के साथ एक और चाल है, लेकिन डीबग कोड में जोर दे रही है। उदाहरण के लिए, पहले (x> 10) जांच का उपयोग करें, और फिर यदि गलत स्थिति गुजरती है, तो बस (! "X सीमाओं से बाहर") पर जोर दें और फिर लॉगफाइल पर प्रिंट करें, आदि – Marcin