टीएल; डीआर सी कंपाइलर चेतावनी नहीं देते हैं, क्योंकि वे वहां कोई समस्या नहीं देखते हैं। परिभाषा के अनुसार, सी स्ट्रिंग अक्षर शून्य से char
सरणी समाप्त कर दिए जाते हैं। यह केवल कहा गया है कि,
[...] कार्यक्रम इस तरह के एक सरणी संशोधित करने के लिए प्रयास करता है, व्यवहार अनिर्धारित रहता है।
तो, संकलन की प्रक्रिया में है, यह संकलक है कि एक char
सरणी एक स्ट्रिंग शाब्दिक या स्ट्रिंग के रूप में व्यवहार करना चाहिए करने के लिए नहीं जाना जाता है। केवल संशोधन का प्रयास प्रतिबंधित प्रतिबंधित है।
संबंधित पढ़ें: दिलचस्पी लेने वाले किसी के लिए, Why are C string literals read-only?
यही कहा, मैं बहुत यकीन नहीं है कि यह एक अच्छा विकल्प है नहीं कर रहा हूँ देखते हैं, लेकिन gcc
-Wwrite-strings
का विकल्प है।
का हवाला देते हुए online manual,
-Wwrite-strings
जब सी संकलन, स्ट्रिंग देना प्रकार const char[length]
ताकि गैर const char *
सूचक में एक के पते को कॉपी एक चेतावनी का उत्पादन स्थिरांक। ये चेतावनियां आपको संकलित समय कोड में खोजने में मदद करती हैं जो एक स्ट्रिंग स्थिर में लिखने का प्रयास कर सकती है, लेकिन केवल तभी जब आप घोषणाओं और प्रोटोटाइप में कॉन्स्ट का उपयोग करने के बारे में बहुत सावधान रहें। अन्यथा, यह सिर्फ एक उपद्रव है। यही कारण है कि हमने -Wall
इन चेतावनियों का अनुरोध नहीं किया।
तो, यह एक चेतावनी पिछले दरवाजे तरह से उपयोग करते हुए पैदा करता है।
परिभाषा के अनुसार, सी स्ट्रिंग अक्षर (यानी, वर्ण स्ट्रिंग अक्षर) char
शून्य टर्मिनेटर के साथ सरणी हैं। मानक उन्हें const
योग्यता के लिए जरूरी नहीं है।
रेफरी: C11
, अध्याय
अनुवाद चरण 7 में, एक बाइट या शून्य मूल्य का कोड प्रत्येक multibyte चरित्र अनुक्रम कि एक स्ट्रिंग से परिणाम शाब्दिक या शाब्दिक में जोड़ा जाता है। मल्टीबाइट कैरेक्टर अनुक्रम का उपयोग तब स्थिर स्टोरेज अवधि और लंबाई की एक सरणी को प्रारंभ करने के लिए किया जाता है, जो अनुक्रम को रखने के लिए पर्याप्त है। चरित्र स्ट्रिंग अक्षर के लिए, सरणी तत्वों में टाइप char
है, और मल्टीबाइट वर्ण अनुक्रम के व्यक्तिगत बाइट्स के साथ आरंभ किया गया है। [....]
पूर्वोक्त विकल्प का उपयोग स्ट्रिंग शाब्दिकconst
योग्य तो एक स्ट्रिंग एक गैर स्थिरांक प्रकार सूचक को असाइनमेंट की आरएचएस के रूप में शाब्दिक का उपयोग कर एक चेतावनी चलाता है बनाता है।
यह C11
के संदर्भ में, अध्याय §6.7.3
एक प्रयास गैर const- के साथ एक lvalue के उपयोग के माध्यम से एक वस्तु एक स्थिरांक योग्य प्रकार से परिभाषित संशोधित करने के लिए किया जाता है के साथ किया जाता योग्य प्रकार, व्यवहार अपरिभाषित है। [...]
तो, यहाँ संकलक गैर const
-qualified प्रकार के const
योग्य प्रकार के कार्य के लिए एक चेतावनी पैदा करता है।
क्यों -Wall -Wextra -pedantic -std=c11
का उपयोग कर इस चेतावनी का उत्पादन नहीं करता करने के लिए संबंधित, एक बार फिर बोली के हवाले से, है
[...] इन चेतावनियों आप संकलन समय कोड है कि एक में लिखने के लिए कोशिश कर सकते हैं पर खोजने में मदद स्ट्रिंग स्थिर, लेकिन केवल तभी जब आप घोषणाओं और प्रोटोटाइप में कॉन्स्ट का उपयोग करने के बारे में बहुत सावधान रहें। अन्यथा, यह सिर्फ एक उपद्रव है। यही कारण है कि हमने -Wall
इन चेतावनियों का अनुरोध नहीं किया।
यह डिफ़ॉल्ट रूप से चालू नहीं है क्योंकि दुख की बात है कि अभी भी गैर-कॉन्स सही फैशन में लिखे गए विरासत कोड के ढेर हैं। कुछ भी 'const' को सी – StoryTeller
में जोड़ने की भविष्यवाणी करते हैं डिफ़ॉल्ट रूप से ऐसी चेतावनी को सक्षम करने से अलार्म थकान हो जाएगी। यह अच्छा होगा कि कंपेलरों ने इसके लिए चेतावनी दी है लेकिन अभी भी बहुत पुराना कोड है जो अभी भी सही कोड होने पर इस पर यात्रा करेगा। – Art