सी

2012-08-09 29 views
9

में कॉन्स्ट-शुद्धता स्पष्ट रूप से const का उपयोग करने के लिए अच्छा अभ्यास है जब तक कि कुछ म्यूटेबल होने का मतलब न हो, लेकिन आप कितनी दूर जाते हैं? अगर मेरे पास तारों की एक सरणी है, तो क्या मेरे फ़ंक्शन हस्ताक्षर में यह शामिल होना चाहिए?सी

char const * const * const my_strings 

मैं जो भी इसे संशोधित करने के लिए नहीं जा रहा हूँ, तो यह लगातार पात्रों में से सरणियों के पहले तत्व के लिए निरंतर संकेत की एक सरणी के पहले तत्व के लिए एक निरंतर सूचक है। यह एक मुट्ठी भर है, और कोड लगभग अपठनीय है। यह सब एक साधारण डेटा संरचना है जैसे argv

मुझे लगता है कि कॉन्स्ट डिफ़ॉल्ट होना चाहिए और एक परिवर्तनीय कीवर्ड होना चाहिए।

क्या आप आम तौर पर उन const एस में से एक हैं? तब उस बिंदु का क्या मतलब है, यदि आप इसे कम से कम कम करके कम आसानी से बदल सकते हैं?

+3

अपने प्रश्न के दूसरे भाग के लिए, [comp.lang.c अकसर किये गए सवाल 11.10] (http://c-faq.com/ansi/constmismatch.html) –

+0

@ जॉनबर्थोलोम्यू: धन्यवाद। मुझे एहसास नहीं हुआ कि मैं बस संदेश को दूर करने के लिए डाला जा सकता था। – mk12

+0

हां, 'const' शायद डिफ़ॉल्ट होना चाहिए। मेरा मानना ​​है कि बजेर्न स्ट्राउस्टुप ने वही कहा है लेकिन उन्हें सी के साथ पिछड़े संगतता को बनाए रखना था। पहले से ही एक कीवर्ड 'mutable' है। – bames53

उत्तर

5

मैं आम तौर पर तीन const रों के दो प्रयोग करेंगे:

const char *const *my_strings; 

कभी कभी मैं सभी तीन का प्रयोग करेंगे, लेकिन मेरी राय में पिछले एक कम से कम महत्वपूर्ण है। यह केवल उस कोड का विश्लेषण करने में मदद करता है जो परिवर्तनीय my_strings का उपयोग करता है, जबकि अन्य दो मदद कोड का विश्लेषण करते हैं जिसमें सरणी के लिए कोई सूचक है my_strings, या उस सरणी के तत्वों द्वारा इंगित तारों के लिए। यह आमतौर पर कई अलग-अलग स्थानों में अधिक कोड होता है (उदाहरण के लिए फ़ंक्शन का कॉलर और फ़ंक्शन स्वयं), और इसलिए एक कठिन कार्य है।

वेरिएबल का उपयोग करने वाला कोड my_strings के दायरे तक सीमित है, इसलिए यदि यह स्वचालित चर (फ़ंक्शन पैरामीटर समेत) है तो यह अच्छी तरह से निहित और आसान कार्य है। const को चिह्नित करके प्रदान की गई सहायता की अभी भी सराहना की जा सकती है, लेकिन यह कम महत्वपूर्ण है।

मैं यह भी कहूंगा कि अगर char const * const * const my_strings "लगभग अपठनीय" है, तो जब आप सी पढ़ने में अधिक अभ्यास करेंगे तो यह बदल जाएगा, और कोड को बदलने से बेहतर अभ्यास करना बेहतर होगा। सी कोड लिखने में कुछ मूल्य है जिसे आसानी से नौसिखियों द्वारा पढ़ा जा सकता है, लेकिन कुछ काम करने में उतना ही मूल्य नहीं है ;-)

आप चरबी परिभाषा को कम करने के लिए टाइपपीफ का उपयोग कर सकते हैं एक अविवेक है कि कई C प्रोग्रामर परेशान करेगा शुरू:

typedef char const *ro_strptr; 
ro_strptr const *my_strings; 

जो कुछ कारणों के लिए, C प्रोग्रामर अक्सर एक ही स्थान पर एक प्रकार का जितना संभव हो उतना देखना चाहते हैं। केवल जब प्रकार वास्तव में जटिल हो जाता है (पॉइंटर-टू-फ़ंक्शन प्रकार) क्या आप पूरी तरह से संक्षिप्त करने के लिए टाइपिफ़ का उपयोग कर सकते हैं, आधे उम्मीद के बिना कि कोई इसके बारे में शिकायत करेगा।

+0

लगभग अपठनीय द्वारा मेरा मतलब यह नहीं था कि यह समझना मुश्किल है क्योंकि यह बहुत सी शोर की तरह लगता है। Typedefs का उपयोग करने पर – mk12

+0

+1। यह ध्यान देने योग्य है कि अगर कोई वास्तव में चाहते हैं तो कोई भी आपके डेटा को बदलने से रोक सकता है। तो इस डिग्री के लिए कॉन्स-शुद्धता को पूर्ण करना हमेशा उपयोगी नहीं होता है - यह अधिक इच्छित उपयोग को इंगित करता है। – Scotty

+0

@ स्कोटी: कॉन्स्ट-शुद्धता अन्य डेटा-कॉन्स-सही कोड को मेरे डेटा को बदलने से रोक सकती है। इसलिए यदि वे वास्तव में इसे बदलना चाहते हैं, लेकिन अनुशासित हैं, तो वे स्वयं को रोक देंगे और सिस्टम काम करेगा। सी प्रोग्रामर जो अनुशासित नहीं हैं, बहुत सारे अपरिभाषित व्यवहार का कारण बनते हैं, और कॉन्स्ट ऑब्जेक्ट्स को संशोधित करना वे कई तरीकों से एक है :-) इसलिए मैं मानता हूं कि यह इच्छित उपयोग इंगित करता है, वास्तव में * अनुमति * उपयोग, लेकिन मैं बताता हूं इरादा/अनुमत उपयोग, यानि विभिन्न घटकों के बीच दस्तावेज अनुबंध, जो एक कामकाजी कार्यक्रम और धूम्रपान बर्बाद होने के बीच है। –