मैं कॉन्स्ट-सही कोड बनाने की कोशिश करते समय एक छोटी सी समस्या पर ठोकर खाई।क्या जीसीसी मुझे सी 99 में एक कॉन्स स्ट्रक्चर के क्षेत्रों को संशोधित करने के बारे में चेतावनी दे सकता है?
मुझे कंपाइलर को बताने के लिए एक कॉन्स स्ट्रक्चर को पॉइंटर लेना पसंद होता, "कृपया मुझे बताएं कि क्या मैं संरचना को संशोधित कर रहा हूं, क्योंकि मैं वास्तव में नहीं चाहता हूं"। ,
struct A
{
char *ptrChar;
};
void f(const struct A *ptrA)
{
ptrA->ptrChar[0] = 'A'; // NOT DESIRED!!
}
कौन सा समझा जा सकता है क्योंकि वास्तव स्थिरांक है सूचक ही नहीं, बल्कि प्रकार यह ओर इशारा करता है:
यह अचानक मेरे दिमाग कि संकलक मुझे ऐसा करने की अनुमति देगा के लिए आया था। मैं संकलक के बारे में बताना चाहता हूं कि मैं ऐसा कुछ कर रहा हूं जो मैं नहीं करना चाहता, हालांकि, यदि यह भी संभव है।
मैंने अपने कंपाइलर के रूप में जीसीसी का उपयोग किया। हालांकि मुझे पता है कि ऊपर दिया गया कोड कानूनी होना चाहिए, फिर भी मैंने जांच की है कि क्या यह चेतावनी जारी करेगा, लेकिन कुछ भी नहीं आया। मेरी कमांड लाइन थी:
gcc -std=c99 -Wall -Wextra -pedantic test.c
क्या इस मुद्दे को हल करना संभव है?
यह मामला सदस्य के असाइनमेंट के लिए काम करता है। E.g 'ptrA-> ptrChar = malloc (2); 'कौन सा सदस्य इंगित कर रहा है ऐसा नहीं है। – BLUEPIXY
[इसी तरह का सवाल] (http://stackoverflow.com/questions/13181546/const-correctness-for-structs-with-pointers) –
इस उद्देश्य के लिए मेरे पास आमतौर पर एक शीर्षलेख होता है जो 'आगे एक संरचना' घोषित करता है, और, 'a_do_something (const struct * a) में कुछ फ़ंक्शन घोषणाएं;' हेडर फ़ाइल में 'स्ट्रक्चर ए' की पूरी परिभाषा को शामिल करना शायद ही आवश्यक है। आपने अलग-अलग अनुवाद इकाइयों में अपने 'f' जैसे कई फ़ंक्शंस डाले हैं, जहां' f' केवल इस तरह की सामग्री = a_do_something (ptrA) की तरह पीआरटीए का उपयोग करेगा; ' –