जैसा कि कई हालिया प्रश्नों में चर्चा की गई है, const
घोषित किया गया है - सी में योग्य चर (सी 0+ में const
चर के विपरीत, या सी में const
पर पॉइंटर्स) आमतौर पर बहुत कम उद्देश्य प्रदान करता है। सबसे महत्वपूर्ण बात यह है कि उन्हें निरंतर अभिव्यक्ति में उपयोग नहीं किया जा सकता है।सी में कॉन्स्ट-क्वालिफाइड चर के लिए कुछ व्यावहारिक उपयोग क्या हैं?
इसके साथ, const
सी में योग्य चर के कुछ वैध उपयोग क्या हैं? मैं उन कुछ लोगों के बारे में सोच सकता हूं जो हाल ही में कोड में आए हैं जिनके साथ मैंने काम किया है, लेकिन निश्चित रूप से अन्य होना चाहिए। , एक सूचक के लिए विशेष प्रहरी मूल्यों के रूप में उनके पते का उपयोग करना तो कभी नहीं के रूप में किसी अन्य सूचक के बराबर की तुलना करने के
: यहाँ मेरी सूची है। उदाहरण के लिए:
char *sentinel(void) { static const char s; return &s; }
या बसconst char sentinel[1];
चूंकि हम केवल पते के बारे में परवाह करते हैं और इससे कोई फर्क नहीं पड़ता कि ऑब्जेक्ट को लिखा गया था,const
का एकमात्र लाभ यह है कि संकलक आमतौर पर केवल पढ़ने-योग्य स्मृति में संग्रहीत करेंगे जोmmap
द्वारा समर्थित है निष्पादन योग्य फ़ाइल या शून्य पृष्ठ की एक प्रति।लाइब्रेरी के नए संस्करणों के साथ मूल्य बदल सकता है, जब पुस्तकालय (विशेष रूप से साझा पुस्तकालयों) से मूल्यों को निर्यात करने के लिए
const
योग्य चर का उपयोग करना। ऐसे मामलों में, लाइब्रेरी के इंटरफ़ेस हेडर में#define
का उपयोग करना एक अच्छा दृष्टिकोण नहीं होगा क्योंकि यह उस लाइब्रेरी के विशेष संस्करण में स्थिरांक के मानों पर निर्भर करेगा जो इसे बनाया गया था।बारीकी से पिछले उपयोग से संबंधित है, कभी कभी आप आवेदन करने के लिए एक पुस्तकालय से पूर्व निर्धारित वस्तुओं को बेनकाब करना चाहते हैं (सर्वोत्कृष्ट उदाहरण जा रहा है
stdin
,stdout
, और मानक पुस्तकालय सेstderr
)। उस उदाहरण का उपयोग करते हुए,extern FILE __stdin; #define stdin (&__stdin)
अधिकांश सिस्टम साझा पुस्तकालयों को लागू करने के तरीके के कारण बहुत खराब कार्यान्वयन होगा - आमतौर पर उन्हें पूरे ऑब्जेक्ट (यहां,FILE
) की आवश्यकता होती है ताकि एप्लिकेशन लिंक होने पर निर्धारित पते पर कॉपी किया जा सके और एक निर्भरता लागू हो सके ऑब्जेक्ट का आकार (यदि पुस्तकालय पुनर्निर्मित किया जाता है और ऑब्जेक्ट का आकार बदलता है तो प्रोग्राम टूट जाएगा)।const
पॉइंटर का उपयोग करना (पॉइंटर-टू -const
नहीं) यहां सभी समस्याओं को हल करता है:extern FILE *const stdin;
, जहांconst
पॉइंटर को प्री-डिफ़ाइंड ऑब्जेक्ट (जिसे स्वयंstatic
घोषित किया गया है) पुस्तकालय में कहीं भी आंतरिक रूप से इंगित करने के लिए प्रारंभ किया गया है।गणितीय कार्यों, चरित्र गुणों आदि के लिए लुकअप टेबल। यह स्पष्ट है कि मैं मूल रूप से शामिल करना भूल गया था, शायद इसलिए कि मैं व्यक्तिगत
const
अंकगणित/सूचक प्रकार के चर के बारे में सोच रहा था, वैसे ही सवाल विषय पहले आया था अप। मुझे याद रखने के लिए ट्रिगर करने के लिए एडन के लिए धन्यवाद।लुकअप टेबल पर एक संस्करण के रूप में, राज्य मशीनों के कार्यान्वयन के रूप में। एडन ने एक उत्तर के रूप में एक विस्तृत उदाहरण प्रदान किया। मैंने पाया है कि वही अवधारणा अक्सर किसी भी फ़ंक्शन पॉइंटर्स के बिना बहुत उपयोगी होती है, यदि आप कुछ संख्यात्मक मानकों के संदर्भ में प्रत्येक राज्य से व्यवहार/संक्रमण को एन्कोड कर सकते हैं। बाकी
किसी को भी सी में const
-qualified चर के लिए कुछ चतुर, व्यावहारिक उपयोग है?
हालांकि यह काम करता है, मुझे __ffine my_inport (* (unsigned char const volatile *) 0x00FA) पर लाभ नहीं दिखाई देता है और फिर 'c = my_inport' करने में सक्षम होने के नाते; मेरा संस्करण शायद संकलित होगा छोटे/अधिक कुशल कोड क्योंकि यह निरंतर अभिव्यक्ति है, जबकि 'const' चर के साथ संस्करण वास्तव में प्रत्येक बार उपयोग किए जाने पर अप्रत्यक्ष रूप से पता लोड कर सकता है। –
यह मूल रूप से '# परिभाषित' स्थिरांक की उम्र पुरानी तर्क 'बनाम' स्थिरांक बनाम है। आम तौर पर, कोई भी दूसरे की तुलना में बेहतर या बुरा नहीं होता है। यह सिर्फ एक भाषा निर्माण है और एक प्रीप्रोसेसर कमांड है। अक्सर यह अनदेखा किया जाता है कि एक प्रोग्रामिंग भाषा किसी प्रोग्राम के व्याख्या के लिए निर्देशों के एक सेट से अधिक कुछ नहीं है। सी के मामले में, कार्यक्रम एक कंपाइलर है जिसका काम अनुकूलित असेंबली कोड का उत्पादन करना है। तो भाषा संरचनाओं का उपयोग करके इसे अधिक जानकारी प्रदान करनी चाहिए और इसे अधिक प्रासंगिक परिणाम देने की अनुमति देनी चाहिए। हालांकि, यह 'परिभाषित 'के साथ खो गया है। – DuFace