दिलचस्प पोस्ट
अतुल्यकालिक बनाम गैर-अवरोधन किसी निजी सदस्य के बिना संपत्ति के रूप में एक निजी सदस्य और संपत्ति को परिभाषित करने में क्या अंतर है? सबप्लॉट कैसे काम करता है और MATLAB में सबप्लॉट (121) और सबप्लॉट (1,2,1) के बीच अंतर क्या होता है? मैं अपना MySQL उपयोगकर्ता नाम और पासवर्ड कैसे प्राप्त करूं? इसका अर्थ क्या है कि जावास्क्रिप्ट एक प्रोटोटाइप आधारित भाषा है? क्या मेरे PHP फ़ंक्शन तर्कों की एक सरणी स्वीकार करते हैं या मुझे स्पष्ट रूप से तर्कों का अनुरोध करना चाहिए? एक आईडीई के रूप में ईएमएसीएस का इस्तेमाल करना पीएचपी लघु टैग कैसे सक्षम करें? पीडीओ और तैयार बयान के साथ mysql_ * फ़ंक्शन को बदलना क्या बाश में शेलशॉक भेद्यता के पीछे व्यवहार दस्तावेज या सभी जानबूझकर है? जब तक एक प्रभाव समाप्त होने तक प्रतीक्षा करने के लिए jQuery कैसे प्राप्त करें? डेटा के एक पूरे कॉलम में अग्रणी या अनुगामी रिक्त स्थान निकालें Git रीसेट – हार्ड से पुनर्प्राप्त करें? स्विफ्ट में ट्यूपल्स का ऐरे आप HTML चयन बॉक्स में चयनित विकल्पों को कैसे सीमित करते हैं?

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 के रूप में घोषित किया है, इसलिए इसका मान केवल पढ़ा जा सकता है …. मान को परिवर्तित नहीं किया जा सकता

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

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