2011-04-13 18 views
6

हाल ही में मैं इस जैसे कोड पर ठोकर खाई:सी-स्टाइल में const_cast semantics को अक्षम करने के लिए कंपाइलर स्विच?

void foo(const Bar* b) { 
    ... 
    takes_nonconst_param_fn((Bar*)b); 
    ... 

जाहिर है, डेवलपर पता नहीं था कि वह क्या कर रहा था, लेकिन अगर संकलक था चुपचाप सी शैली कलाकारों स्वीकार नहीं किया और कम से कम आवश्यक एक उचित const_cast, वह इसे करने से पहले दो बार हो सकता है।

तो यह मुझे सोचने लगा, क्या किसी आधुनिक कंपाइलर के पास सी-स्टाइल-कास्ट के लिए const_cast अर्थशास्त्र को रोकने के लिए स्विच है?

यह बस ग-शैली-डाले की सभी घटनाओं को रोकने के लिए व्यावहारिक नहीं है और यह अनुमति देने के लिए एक आवश्यक बुराई है उनके static_ और reinterpret_ अर्थ विज्ञान (यदि केवल कुछ पुस्तकालय कोड के लिए), लेकिन मेरी धारणा, ग की कि वैध उपयोग है सी ++ कोड बेस में बहुत कठोरता कास्ट करने के लिए स्टाइल-कास्ट बहुत दुर्लभ है, तो हो सकता है कि इसे पूरी तरह से अक्षम करना संभव हो?

+0

क्या आप फू को 'शून्य फू (कॉन्स बार * बी) कॉन्स' घोषित करते हैं तो इससे कोई फर्क पड़ता है? – James

+2

@ जेम्स: आप उम्मीद करते हैं कि यह स्पष्ट करने के लिए कि कैसे स्पष्ट कार्य करता है? यदि 'foo' सदस्य फ़ंक्शन है, तो वह कार्य के भीतर ऑब्जेक्ट सदस्यों को' const' बना देगा; यदि नहीं, तो यह एक त्रुटि होगी। –

+1

दरअसल मैं चाहता हूं कि मैं अपने 'static_cast' फॉर्म के अलावा सभी को अक्षम कर सकूं। –

उत्तर

7

जीसीसी के पास -Wcast-qual विकल्प है जब सी-स्टाइल कास्ट एक प्रकार क्वालीफायर को हटा देता है। -Werror के साथ संयुक्त, यदि आप चाहें तो इसे पूरी तरह से रोक सकते हैं।

+4

सभी पुराने जानवरों के लिए भील्ड-स्टाइल-कास्ट पर विचार करें। –

+0

नाइस: एक और ध्वज मुझे आवश्यक झंडे की सूची में जोड़ने की जरूरत है। –