मैंने कलाकारों में केवल टाइप सिस्टम में बदसूरत छेद की अस्वीकृति को दिखाने के लिए डाला, जो कोड को निम्न स्निपेट के रूप में निदान के बिना संकलन करने की अनुमति देता है, भले ही किसी भी कास्ट का उपयोग खराब रूपांतरण के बारे में बताने के लिए नहीं किया गया हो:
double d;
void *p = &d;
int *q = p;
मैं चाहता हूं कि अस्तित्व में नहीं था (और यह C ++ में नहीं है) और इसलिए मैंने कास्ट किया। यह मेरे स्वाद और मेरी प्रोग्रामिंग राजनीति का प्रतिनिधित्व करता है। मैं न केवल एक सूचक कास्ट कर रहा हूं, बल्कि प्रभावी रूप से, एक बैलट कास्ट कर रहा हूं, और मूर्खता के राक्षसों को बाहर निकाल रहा हूं । अगर मैं वास्तव में मूर्खता नहीं कर सकता , तो कम से कम मुझे विरोध के एक इशारे के साथ ऐसा करने की इच्छा व्यक्त करें।
वास्तव में, एक अच्छा अभ्यास उन malloc
कार्यों के साथ लपेटना (और दोस्तों) है जो वापस आते हैं unsigned char *
, और मूल रूप void *
से आपके कोड में उपयोग करने के लिए कभी नहीं । आप एक सामान्य सूचक करने वाली किसी भी वस्तु की जरूरत है, एक का उपयोग char *
या unsigned char *
, और दोनों दिशाओं में डाले है। एक छूट, जो लिप्त हो सकती है, शायद, जैसे कार्यों का उपयोग कर रहा है memset
और memcpy
बिना कलाकारों के।
कास्टिंग और C ++ संगतता के विषय पर, यदि आप अपना कोड लिखते हैं ताकि यह C और C ++ दोनों के रूप में संकलित हो (जिस स्थिति में आपको इसकेmalloc
अलावा किसी अन्य चीज़ को असाइन करते समय रिटर्न वैल्यू डालनी पड़ेvoid *
), तो आप बहुत मदद कर सकते हैं खुद के लिए बात: आप कास्टिंग के लिए मैक्रोज़ का उपयोग कर सकते हैं जो C ++ के रूप में संकलित होने पर C ++ शैली की कास्ट में अनुवाद करते हैं, लेकिन C के रूप में संकलित होने पर C कास्ट में कमी करते हैं:
/* In a header somewhere */
#ifdef __cplusplus
#define strip_qual(TYPE, EXPR) (const_cast<TYPE>(EXPR))
#define convert(TYPE, EXPR) (static_cast<TYPE>(EXPR))
#define coerce(TYPE, EXPR) (reinterpret_cast<TYPE>(EXPR))
#else
#define strip_qual(TYPE, EXPR) ((TYPE) (EXPR))
#define convert(TYPE, EXPR) ((TYPE) (EXPR))
#define coerce(TYPE, EXPR) ((TYPE) (EXPR))
#endif
यदि आप इन मैक्रोज़ का पालन करते हैं, तो grep
इन पहचानकर्ताओं के लिए आपके कोड आधार की एक सरल खोज आपको दिखाएगी कि आपके सभी कलाकार कहां हैं, इसलिए आप समीक्षा कर सकते हैं कि उनमें से कोई गलत है या नहीं।
फिर, आगे बढ़ते हुए, यदि आप नियमित रूप से C ++ के साथ कोड संकलित करते हैं, तो यह एक उपयुक्त कलाकारों के उपयोग को लागू करेगा। उदाहरण के लिए, आप का उपयोग करता है, तो strip_qual
एक को दूर बस के लिए const
या volatile
, लेकिन इस तरह से कि एक प्रकार रूपांतरण अब शामिल है में कार्यक्रम के बदलाव, क्या आप नैदानिक मिल जाएगा, और आप डाले के संयोजन का उपयोग करने के लिए वांछित रूपांतरण प्राप्त करना होगा।
इन मैक्रोज़ का पालन करने में आपकी सहायता करने के लिए, GNU C ++ (C नहीं!) संकलक की एक सुंदर विशेषता है: एक वैकल्पिक निदान जो C शैली की सभी घटनाओं के लिए उत्पन्न होता है।
-गोल्ड-स्टाइल-कास्ट (सी ++ और ऑब्जेक्टिव-सी ++ केवल)
यदि कोई पुरानी शैली (सी-शैली) एक गैर-शून्य प्रकार के लिए डाली जाती है तो चेतावनी दी जाती है
C ++ प्रोग्राम के भीतर। नई शैली की जातियां (डायनामिक_कास्ट,
static_cast, reinterpret_cast, और const_cast) कम असुरक्षित हैं
अनपेक्षित प्रभावों और खोजने के लिए बहुत आसान है।
यदि आपका C कोड C ++ के रूप में संकलित होता है, तो आप इस -Wold-style-cast
विकल्प का उपयोग (type)
कास्टिंग सिंटैक्स की सभी घटनाओं का पता लगाने के लिए कर सकते हैं जो कोड में रेंग सकते हैं, और इन डायग्नॉस्टिक्स का अनुसरण करके उपरोक्त मैक्रोज़ (या) में से एक उपयुक्त विकल्प के साथ प्रतिस्थापित कर सकते हैं। संयोजन, यदि आवश्यक हो)।
रूपांतरण का यह उपचार "क्लीन सी" में काम करने के लिए एकल सबसे बड़ा स्टैंडअलोन तकनीकी औचित्य है: संयुक्त सी और सी ++ बोली, जो बदले में तकनीकी रूप से रिटर्न वैल्यू के कास्टिंग को सही ठहराते हैं malloc
।