सी भाषा ऐसी कुछ भी नहीं करती है जिसे आप स्पष्ट रूप से करने के लिए नहीं बताते हैं।
आपके लिए स्वचालित रूप से बुलाए जाने वाले कोई भी विनाशक नहीं हैं, जो दोनों अच्छे और बुरे हैं (क्योंकि विनाशकों में कीड़े दर्द हो सकती हैं)।
कुछ हद तक स्वचालित विनाशक व्यवहार प्राप्त करने का एक आसान तरीका चीजों को बनाने और नष्ट करने के लिए स्कोपिंग का उपयोग करना है। यह बदसूरत हो सकता है क्योंकि नेस्टेड स्कॉप्स चीजों को आगे और आगे ले जाते हैं।
if (var = malloc(SIZE)) { // try to keep this line
use_var(var);
free(var); // and this line close and with easy to comprehend code between them
} else {
error_action();
}
return; // try to limit the number of return statements so that you can ensure resources
// are freed for all code paths
अपना कोड जितना संभव हो उतना दिखने की कोशिश कर रहा है, हालांकि यह हमेशा संभव नहीं होता है।
मैक्रोज़ या इनलाइन फ़ंक्शंस का एक सेट बनाना जो आपकी ऑब्जेक्ट्स को प्रारंभ करना एक अच्छा विचार है। साथ ही उन कार्यों का एक और सेट भी बनाएं जो आपकी ऑब्जेक्ट्स मेमोरी आवंटित करें और इसे अपने प्रारंभिक कार्यों में पास करें। यह स्थानीय और गतिशील रूप से आवंटित वस्तुओं दोनों को आसानी से प्रारंभ करने की अनुमति देता है। विनाशक-जैसे कार्यों के लिए इसी तरह के संचालन भी एक अच्छा विचार है।
ओओ तकनीकों का उपयोग कई मामलों में अच्छा अभ्यास है, और सी में ऐसा करने के लिए थोड़ा और टाइपिंग की आवश्यकता होती है (लेकिन अधिक नियंत्रण के लिए अनुमति देता है)। पुटर, गेटर्स और अन्य सहायक फ़ंक्शन लगातार राज्यों में ऑब्जेक्ट्स रखने में मदद कर सकते हैं और जब आपको कोई त्रुटि मिलती है तो आपके द्वारा किए गए परिवर्तनों को कम कर सकते हैं, यदि आप इंटरफ़ेस को समान रख सकते हैं।
आपको perror
फ़ंक्शन और errno
"variabl" में भी देखना चाहिए।
आमतौर पर आप सी में अपवादों जैसे कुछ भी उपयोग करने से बचना चाहते हैं। मैं आम तौर पर उन्हें सी ++ में से बचने की कोशिश करता हूं, और केवल उन्हें वास्तव में खराब त्रुटियों के लिए उपयोग करता हूं - जो ऐसा नहीं होने चाहिए। उनसे बचने के मुख्य कारणों में से एक यह है कि सी में जादुई रूप से कोई विनाशक कॉल नहीं होता है, इसलिए गैर-स्थानीय GOTO अक्सर कुछ प्रकार के संसाधन को रिसाव (या अन्यथा खराब कर देते हैं)। ऐसा कहा जा रहा है कि सी में चीजें हैं जो समान कार्यक्षमता प्रदान करती हैं।
सी में तंत्र जैसे मुख्य अपवाद setjmp
और longjmp
फ़ंक्शंस हैं। setjmp
को कोड में एक स्थान से बुलाया जाता है और एक (अपारदर्शी) चर (jmp_buf) पारित किया जाता है जिसे बाद में longjmp
पर भेज दिया जा सकता है। जब longjmp
पर कॉल किया जाता है तो यह वास्तव में कॉलर पर वापस नहीं आता है, लेकिन उस jmp_buf के साथ पहले setjmp
कहा जाता है। setjmp
कॉल द्वारा निर्दिष्ट मान को longjmp
पर वापस कर देगा। नियमित कॉल setjmp
वापसी 0
कार्यक्षमता जैसे अन्य अपवाद अधिक प्लेटफ़ॉर्म विशिष्ट हैं, लेकिन सिग्नल (जिनमें उनके स्वयं के गॉचेस हैं) शामिल हैं।
अन्य बातों पर गौर करने के लिए कर रहे हैं:
assert
मैक्रो, जो कार्यक्रम बाहर निकलने के कारण करने के लिए जब पैरामीटर (किसी प्रकार की कोई तार्किक परीक्षण) में विफल रहता है इस्तेमाल किया जा सकता। assert
पर कॉल करें जब आप #include <assert.h>
से पहले जाते हैं, तो परीक्षण के बाद आप आसानी से दावे को हटा सकते हैं। यह उन सभी संदर्भों के साथ-साथ कई अन्य स्थितियों से पहले नल पॉइंटर्स के परीक्षण के लिए वास्तव में अच्छा है। यदि कोई शर्त assert
विफल फ़ाइल के स्रोत फ़ाइल नाम और लाइन नंबर को मुद्रित करने का प्रयास करती है।
abort
फ़ंक्शन प्रोग्राम को exit
पर कॉल करने वाले सभी साफ़ किए बिना विफलता से बाहर निकलने का कारण बनता है। यह कुछ प्लेटफॉर्म पर सिग्नल के साथ किया जा सकता है। assert
कॉल abort
।
जब मैंने सी पर काम किया - जो कई सालों पहले था, सी - केर्निगन रिची के लिए मेरा पसंदीदा संदर्भ - http://www.amazon.com/gp/product/images/0131103628/ref=dp_image_0?ie=UTF8&n = 283155 और एस = किताबें – InSane
भयानक दुनिया में आपका स्वागत है। अभूतपूर्व प्रदर्शन और लचीलापन के लिए तैयार! –
मैं आपके जैसे ही नाव में हूं, जावा और सी # को पायथन और सी ++ के साथ छोड़कर। मैंने उपरोक्त में दिए गए कोड की समीक्षा करके और पॉइंटर्स पर अनुभाग की समीक्षा करके और मेरी सी ++ पुस्तकों में रहने के दौरान इसका सामना किया है, जबकि मैं रिची की "सी प्रोग्रामिंग भाषा" की अपनी प्रतिलिपि के लिए प्रतीक्षा करता हूं। – xnine