कोड की समीक्षा करते समय, मैं निम्नलिखित नियम लागू करता हूं:
हमेशा const
संदर्भ द्वारा पारित फ़ंक्शन मापदंडों के लिए उपयोग करें जहां फ़ंक्शन इंगित किए गए डेटा को संशोधित (या मुफ्त) नहीं करता है।
int find(const int *data, size_t size, int value);
हमेशा const
स्थिरांक के लिए उपयोग करें जो अन्यथा # डिफाइन या एनम का उपयोग करके परिभाषित किया जा सकता है। कंपाइलर डेटा को रीड-ओनली मेमोरी (ROM) में परिणाम के रूप में ढूँढ सकता है (हालाँकि लिंकर प्रायः एम्बेडेड सिस्टम में इस उद्देश्य के लिए एक बेहतर उपकरण है)।
const double PI = 3.14;
मान द्वारा पारित पैरामीटर के लिए
फ़ंक्शन प्रोटोटाइप में कभी भी कास्ट का उपयोग न करें । इसका कोई अर्थ नहीं है और इसलिए यह केवल 'शोर' है।
// don't add const to 'value' or 'size'
int find(const int *data, size_t size, const int value);
जहाँ उपयुक्त हो, const volatile
उन स्थानों पर उपयोग करें जिन्हें प्रोग्राम द्वारा नहीं बदला जा सकता है लेकिन फिर भी बदल सकते हैं। हार्डवेयर रजिस्टर यहां विशिष्ट उपयोग के मामले हैं, उदाहरण के लिए एक स्थिति रजिस्टर जो एक डिवाइस स्थिति को दर्शाता है:
const volatile int32_t *DEVICE_STATUS = (int32_t*) 0x100;
अन्य उपयोग वैकल्पिक हैं। उदाहरण के लिए, फ़ंक्शन कार्यान्वयन के भीतर एक फ़ंक्शन के मापदंडों को कॉस्ट के रूप में चिह्नित किया जा सकता है।
// 'value' and 'size can be marked as const here
int find(const int *data, const size_t size, const int value)
{
... etc
या फ़ंक्शन मान या गणनाएँ जो प्राप्त की जाती हैं और फिर कभी नहीं बदलती हैं:
char *repeat_str(const char *str, size_t n)
{
const size_t len = strlen(str);
const size_t buf_size = 1 + (len * n);
char *buf = malloc(buf_size);
...
ये const
संकेत केवल ये संकेत देते हैं कि आप परिवर्तनशील नहीं होंगे; वे परिवर्तन नहीं करते कि चर कैसे या कहाँ संग्रहीत किया जाता है। कंपाइलर निश्चित रूप से काम कर सकता है कि एक चर नहीं बदला गया है, लेकिन const
आपको जोड़कर वह इसे लागू करने की अनुमति देता है। यह पाठक की मदद कर सकता है और कुछ सुरक्षा को जोड़ सकता है (हालांकि यदि आपके कार्य बड़े या जटिल हैं कि इससे बहुत फर्क पड़ता है, तो आपको यकीनन कुछ समस्याएँ हैं)। संपादित करें - जैसे। नेस्टेड छोरों और कई लंबे या इसी तरह के चर नामों के साथ एक 200-लाइन घने कोडित फ़ंक्शन, यह जानकर कि कुछ चर कभी नहीं बदलते हैं, अंडरस्टैंडिंग को आसानी से कम कर सकते हैं। इस तरह के कार्यों को बुरी तरह से डिजाइन या मेनटेन किया गया है।
के साथ समस्या const
। आप शायद "कब्ज विषाक्तता" शब्द सुनेंगे। यह तब होता है जब const
किसी फंक्शन पैरामीटर में जोड़ने से 'कब्ज' फैलता है।
संपादित करें - कास्ट पॉइज़निंग: उदाहरण के लिए फ़ंक्शन में:
int function_a(char * str, int n)
{
...
function_b(str);
...
}
यदि हम बदलते str
हैं const
, तो हमें यह सुनिश्चित करना चाहिए कि fuction_b
यह भी एक लेता है const
। और इसलिए यदि आप पर function_b
गुजरता str
है function_c
, आदि। जैसा कि आप कल्पना कर सकते हैं कि यह दर्दनाक हो सकता है अगर यह कई अलग-अलग फ़ाइलों / मॉड्यूलों में फैलता है। यदि यह एक ऐसे फ़ंक्शन में फैलता है जिसे बदला नहीं जा सकता है (जैसे सिस्टम लाइब्रेरी), तो एक कास्ट आवश्यक हो जाता है। तो const
मौजूदा कोड में चारों ओर छिड़क
शायद परेशानी पूछ रहा है। नए कोड में, हालांकि, const
जहां उपयुक्त हो, लगातार योग्य होना सर्वोत्तम है ।
अधिक कपटी समस्या const
यह है कि यह मूल भाषा में नहीं थी। एक ऐड के रूप में यह काफी फिट नहीं है। एक शुरुआत के लिए इसके दो अर्थ हैं (जैसा कि ऊपर के नियमों में है, जिसका अर्थ है "मैं इसे बदलने नहीं जा रहा हूं" और "इसे संशोधित नहीं किया जा सकता")। लेकिन इससे ज्यादा होना खतरनाक हो सकता है। उदाहरण के लिए, इस कोड को संकलित करें और चलाएं (संकलक / विकल्प के आधार पर) यह चलाने पर अच्छी तरह से दुर्घटनाग्रस्त हो सकता है:
const char str[] = "hello world\n";
char *s = strchr(str, '\n');
*s = '\0';
strchr
रिटर्न ए char*
नहीं const char*
। इसके कॉल पैरामीटर है के रूप में
const
यह चाहिए डाली करने के लिए कॉल पैरामीटर char*
। और इस मामले में जो वास्तविक रीड-ओनली स्टोरेज प्रॉपर्टी बनाता है। संपादित करें: - यह आम तौर पर रीड-ओनली मेमोरी में var पर लागू होता है। 'रॉम' से मेरा मतलब केवल शारीरिक रॉम नहीं है, बल्कि कोई भी मेमोरी जो राइट-प्रोटेक्टेड है, जैसा कि एक विशिष्ट ओएस पर चलने वाले प्रोग्राम्स के कोड सेक्शन में होता है।
कई मानक लाइब्रेरी फ़ंक्शंस एक ही तरह से व्यवहार करते हैं, इसलिए सावधान रहें: जब आपके पास वास्तविक स्थिरांक हैं (यानी रोम में संग्रहीत) तो आपको अपने कब्ज़ को खोने के लिए नहीं बहुत सावधान रहना चाहिए।
Specific issues with software development
। मैं काफी विशिष्ट हो रहा हूं।