दिलचस्प पोस्ट
Regex द्वारा सीएसएस पार्सिंग PHP पार्स HTML कोड सामग्री में कैरेट (कर्सर) स्थिति प्राप्त करें HTML सामग्री युक्त संपादन योग्य क्षेत्र पता लगाएँ कि डिवाइस आईफोन एक्स है संतोषजनक, पाठ के अंत में कैरेट सेट करें (क्रॉस-ब्राउज़र) मैं एक JSON ऑब्जेक्ट में एक समय में पढ़ने के लिए 'json' मॉड्यूल का उपयोग कैसे करूं? उद्देश्य-सी में संस्करण संख्याओं की तुलना करें PHP में DOMDocument रेलिंग रूटिंग सहायक (यानी mymodel_path (मॉडल)) क्या मॉडल में उपयोग किया जा सकता है? Angularjs अनचाहे त्रुटि: जब V1.3 को माइग्रेट करना कैसे एक स्थिर समारोह का परीक्षण करने के लिए कौन सी एक्सएचटीएमएल फ़ाइलें मुझे / WEB-INF में डालनी हैं और नहीं? खिड़कियों के लिए शापित विकल्प Platform.RunLater और जावा एफएक्स में कार्य JavaScript में सरणी के माध्यम से लूप

typedef सूचक const weirdness

कृपया निम्नलिखित कोड पर विचार करें:

typedef struct Person* PersonRef; struct Person { int age; }; const PersonRef person = NULL; void changePerson(PersonRef newPerson) { person = newPerson; } 

किसी कारण के लिए, कंपाइलर केवल-पढ़ने योग्य मान के अनुरूप नहीं है, जो नियतनीय नहीं है। लेकिन कॉन्स्ट कीवर्ड को सूचक कॉन्स्ट नहीं करना चाहिए कोई विचार?

वेब के समाधान से एकत्रित समाधान "typedef सूचक const weirdness"

ध्यान दें कि

 typedef int* intptr; const intptr x; 

ऐसा नहीं है:

 const int* x; 

intptr int को सूचक है const intptr int लिए निरंतर सूचक है, निरंतर int लिए सूचक नहीं

इसलिए, एक टाइप किए गए सूचक पॉइंटर के बाद, मैं इसे अब सामग्री के लिए नहीं बना सकता?

कुछ बदसूरत तरीके हैं, जैसे मैक्रोज़ के जीसीसी के प्रकार :

 typedef int* intptr; intptr dummy; const typeof(*dummy) *x; 

लेकिन, जैसा कि आप देख रहे हैं, यदि आप intptr पीछे के प्रकार को जानते हैं तो यह व्यर्थ है

 const PersonRef person = NULL; 

है

 struct Person*const person= NULL; 

तो आप सूचक को परिभाषित कर रहे हैं और वस्तु नहीं

हालांकि समस्या पहले से ऊपर दिए गए उत्तरों से हल हो चुकी है, मुझे इसका कारण याद नहीं है …

तो शायद अंगूठे के नियम के रूप में:

  1. const हमेशा इसके पूर्ववर्ती टोकन को संदर्भित करता है
  2. अगर ऐसी कोई बात नहीं है, तो यह इसके बजाय "टोकन" का उत्तराधिकारी है।

यह नियम वाकई पॉइंटर को कॉन्सेन्ट पॉइंटर्स या कुछ समान रूप से कुछ के लिए घोषित करने में आपकी मदद कर सकता है।

वैसे भी, इसे ध्यान में रखते हुए, यह स्पष्ट होना चाहिए कि क्यों

 struct Person *const person = NULL; 

एक कॉन्स्ट पॉइंटर को एक अस्थायी स्ट्रक्चर घोषित करता है

इसके बारे में सोचें, पॉइंटेटर टोकन * साथ आपके टाइपिंगफेड "समूह" struct Person । तो, लिखने के लिए

 const PersonRef person = NULL; 

आपका कंपाइलर इस तरह कुछ देखता है (छद्म-कोड):

 const [struct Person *]person = NULL; 

चूंकि const के बायीं ओर कुछ भी नहीं है, यह इसे सही struct Person * स्थिर करने के लिए टोकन को हटा देता है

खैर मुझे लगता है, यही कारण है कि मुझे टाइप-फेफ्स द्वारा छद्म संकेतों को छुपाना पसंद नहीं है, जबकि मैं ऐसे टाइपिंगफेप्स की तरह ही करता हूं। लेखन के बारे में क्या

 typedef struct Person { ... } Person; const Person *person; /*< const person */ Person *const pointer; /*< const pointer to mutable person */ 

और यह कंपलर और इंसानों के लिए काफी स्पष्ट होना चाहिए, आप क्या कर रहे हैं

टाइफाइफ़्स के पीछे कभी भी संकेत नहीं छुपें, यह वाकई वास्तव में खराब अभ्यास है और केवल बग पैदा करेगा

ऐसा ही एक कुख्यात बग यह है कि एक टाइपिंगफेड: एड पॉइंटर प्रकार जिसे कॉन्स्ट के रूप में घोषित किया जाता है, को "निरंतर डेटा के लिए निरंतर सूचक" के रूप में माना जाएगा, "निरंतर डेटा के लिए एक निरंतर पॉइंटर" के बजाय जो एक इंटिविट की उम्मीद है । यह आपके कार्यक्रम में क्या होता है।


उपाय:

 typedef struct { int age; } Person; const Person* person = NULL; // non-constant pointer to constant Person 

आप मिल रहे हैं और त्रुटि

 error: assignment of read-only variable 'person' 

बयान पर

 person = newPerson; 

क्योंकि आपने व्यक्ति को const के रूप में घोषित किया है, इसलिए इसका मान केवल पढ़ा जा सकता है …. मान को परिवर्तित नहीं किया जा सकता

अगर आप उस बदलाव को बदलने के लिए जा रहे हैं, तो आप इसे कोंपिंग क्यों कर रहे हैं?

कॉन्स्ट कीवर्ड को हटाने के लिए आपका कोड ठीक काम करेगा