इस समस्या का एक कारण (जो कि इस मुद्दे से पता लगाने के लिए और भी कठिन है char* str = "some string"
- जिसे अन्य लोगों ने समझाया है) जब आप उपयोग कर रहे हैं constexpr
।
constexpr char* str = "some string";
ऐसा लगता है कि यह समान व्यवहार करेगा const char* str
, और इसलिए यह चेतावनी का कारण नहीं होगा, जैसा कि पहले होता है char*
, लेकिन इसके बजाय यह व्यवहार करता है char* const str
।
विवरण
लगातार सूचक, और एक स्थिर करने के लिए सूचक। के बीच का अंतर const char* str
, और char* const str
इस प्रकार समझाया जा सकता है।
const char* str
: एक कास्ट चार करने के लिए एक सूचक होने की घोषणा की। इसका मतलब यह है कि जिस डेटा को यह पॉइंटर बताता है वह निरंतर है। सूचक को संशोधित किया जा सकता है, लेकिन डेटा को संशोधित करने का कोई भी प्रयास एक संकलन त्रुटि को फेंक देगा।
str++ ;
: वैध । हम सूचक को संशोधित कर रहे हैं, न कि डेटा को इंगित किया जा रहा है।
*str = 'a';
: निवेश । हम इंगित किए जा रहे डेटा को संशोधित करने का प्रयास कर रहे हैं।
char* const str
: तारकोल को एक पॉइंटर पॉइंटर होने की घोषणा करें। इसका मतलब है कि बिंदु अब स्थिर है, लेकिन बताया जा रहा डेटा भी नहीं है। पॉइंटर को संशोधित नहीं किया जा सकता है लेकिन हम पॉइंटर का उपयोग करके डेटा को संशोधित कर सकते हैं।
str++ ;
: निवेश । हम सूचक चर को संशोधित करने की कोशिश कर रहे हैं, जो एक स्थिर है।
*str = 'a';
: वैध । हम इंगित किए जा रहे डेटा को संशोधित करने का प्रयास कर रहे हैं। हमारे मामले में यह एक संकलन त्रुटि का कारण नहीं होगा, लेकिन एक रनटाइम त्रुटि का कारण होगा , क्योंकि स्ट्रिंग शायद सबसे अधिक संकलित बाइनरी के केवल एक अनुभाग में जाएगी। यह कथन समझ में आता है अगर हमें गतिशील रूप से स्मृति आवंटित की गई थी, जैसे। char* const str = new char[5];
।
const char* const str
: एक कास्ट चार करने के लिए एक कास्ट पॉइंटर होने की घोषणा करें। इस मामले में हम न तो पॉइंटर को संशोधित कर सकते हैं, न ही डेटा को इंगित किया जा सकता है।
str++ ;
: निवेश । हम सूचक चर को संशोधित करने की कोशिश कर रहे हैं, जो एक स्थिर है।
*str = 'a';
: निवेश । हम इस सूचक द्वारा इंगित किए गए डेटा को संशोधित करने की कोशिश कर रहे हैं, जो निरंतर भी है।
मेरे मामले में मुद्दा यह था कि मैं उम्मीद कर रहा था कि मैं ऐसा constexpr char* str
व्यवहार करूंगा const char* str
, और नहीं char* const str
, क्योंकि दृष्टिगत रूप से यह पूर्व के करीब लगता है।
इसके अलावा, के लिए उत्पन्न चेतावनी constexpr char* str = "some string"
से थोड़ा अलग है char* str = "some string"
।
- इसके लिए संकलक चेतावनी
constexpr char* str = "some string"
:ISO C++11 does not allow conversion from string literal to 'char *const'
- के लिए संकलक चेतावनी
char* str = "some string"
: ISO C++11 does not allow conversion from string literal to 'char *'
।
टिप
आप आसानी से समझने योग्य अंग्रेजी कथनों और इसके विपरीत घोषणाओं को परिवर्तित करने के लिए C gibberish converter अंग्रेजी कनवर्टर का उपयोग कर सकते हैं C
। यह एक C
एकमात्र उपकरण है, और इस प्रकार समर्थन चीजों (जैसे कि कॉन्स्ट्रेप) को अभ्यस्त नहीं है C++
।
strncpy(str, func, 255)
बजाय उपयोग करना चाहिएstrcpy(str, func)
। और फिर स्ट्रिंग के अंत में '\ 0' जोड़ना न भूलें क्योंकि strncpy इसे जोड़ता नहीं है।