9

मैं जीसीसी 4.9 के साथ एम्बेडेड एआरएम प्रोग्रामिंग कर रहा हूं। मैं -Wconversion स्विच का उपयोग कर रहा हूं क्योंकि यह मेरी कंपनी के डिफ़ॉल्ट देव उपकरण कॉन्फ़िगरेशन में है। मैं stdint.h types (uint8_t, uint32_t, आदि) का उपयोग कर रहा हूं।जीसीसी कंपाइलर चेतावनियों को हटाने के लिए टाइपकास्टिंग का उपयोग

संकलक हर बार जब मैं एक यौगिक असाइनमेंट या यहां तक ​​कि सरल जोड़ करता हूं तो चेतावनियां बनाता है। उदाहरण के लिए:

uint8_t u8 = 0; 
uint16_t u16; 

// These cause warnings: 
u8 += 2; 
u8 = u16 >> 8; 

"आम तरीका" इसे ठीक करने, के रूप में चर्चा here और here डाले उपयोग करने के लिए है:

u8 = (uint8_t)(u8 + 2); 
u8 = (uint8_t)(u16 >> 8); 

इस बदसूरत होने के अलावा, मैं ठोस सबूत में प्रदर्शन जारी रहे कि कास्टिंग आम तौर पर खराब अभ्यास है।

मेरे सवालों का:

  1. क्यों यह इस तरह से typecasts उपयोग करने के लिए बुरा है?
  2. क्या मैं -Wconversion को छोड़कर और संकलक को मेरे लिए निहित रूपांतरण देने से कुछ भी खो देता हूं?
+0

इस मामले में टाइपकास्टिंग के बारे में कुछ भी बुरा नहीं है। यदि कुछ भी हो, तो यह दिखाता है कि आपने अर्थशास्त्र, लपेटने के आसपास अंकगणित, छिड़काव आदि माना है - और आप इससे संतुष्ट हैं। –

+0

@ ब्रेटहेल, कम से कम कास्ट * asserts * कि आपने सभी प्रभावों पर विचार किया है और उनसे संतुष्ट हैं। भले ही आपने नहीं किया है, या नहीं। –

+1

@ ब्रेटहेल, यदि आप संभावित गलत कोड के बारे में संकलक को बंद करने के बारे में अधिक परवाह करते हैं तो आप वहां कास्ट डाल सकते हैं (स्कॉफ न करें - ऐसा होता है)। यदि आप सोचते हैं कि आपने सभी प्रभावों पर विचार किया है, तो आप यह भी कर सकते हैं, लेकिन आप गलत हैं। या यहां तक ​​कि अगर आप किसी भी बेहतर नहीं जानते हैं। मैं मानता हूं कि कास्टिंग स्वाभाविक रूप से नहीं है, जरूरी * बुरा * है, लेकिन पहली जगह में डालने की आवश्यकता से बचने के लिए * बेहतर * है। –

उत्तर

3

कंपाइलर आपको संभावित समस्या स्पॉट दिखा रहा है, आपको बदलना चाहिए, लेकिन नहीं। आपके पास कोड में समस्या यह है कि सी में, अंकगणित कभी भी उस प्रकार पर नहीं किया जाता है जो int से संकुचित होता है: संकलक हमेशा उनके लिए int पर एक अंतर्निहित रूपांतरण करता है।

तो प्रभावी ढंग से आपका कोड संकीर्ण हस्ताक्षरित प्रकारों को int में परिवर्तित कर रहा है, ऑपरेशन करता है और फिर उन्हें बिना हस्ताक्षरित प्रकार में परिवर्तित करता है।

आम तौर पर संकीर्ण प्रकारों के साथ अंकगणित करना एक अच्छा विचार नहीं है। भंडारण का आकार एक समस्या है (आमतौर पर यह सरणी जैसे बड़े ढांचे) होगा, केवल उनका उपयोग करें। स्थानीय, कम या ज्यादा अस्थायी चर के लिए इन संकीर्ण प्रकारों का कोई मतलब नहीं है।

3

यह स्वाद का विषय है। जब आप किसी अंकगणितीय प्रकार के किसी भिन्न अंकगणितीय प्रकार के ऑब्जेक्ट को मानते हैं तो सी द्वारा कभी भी एक कलाकार की आवश्यकता नहीं होती है। कुछ लोग दस्तावेज के लिए कास्ट का उपयोग करते हैं, वहां एक छिपी हुई रूपांतरण है और उन्होंने इसे उद्देश्य पर किया है।

व्यक्तिगत तौर पर मैं अतिरिक्त बेकार सामान डाल करने के लिए पसंद नहीं है और मैं पाठक सी की मूल बातें जानता है तो मैं मान कलाकारों से बचने के लिए करते हैं (और मैं -Wconversion का उपयोग नहीं करते जो -Wall या यहाँ तक कि -Wextra का हिस्सा नहीं है वैसे भी)। ध्यान दें कि एक असाइनमेंट में यदि दाईं तरफ एक शाब्दिक बायीं तरफ ऑब्जेक्ट gcc में फिट नहीं हो सकता है तो आमतौर पर चेतावनी देता है (बिना -Wall या -Wextra) भले ही असाइनमेंट यूबी नहीं है।

2

जानवरों के साथ समस्या यह है कि वे संकलक को कहते हैं, "चुप रहो, मुझे पता है कि मैं क्या कर रहा हूं", भले ही आप नहीं करते हैं। यदि कोई निर्णय लेता है कि चर 255 से अधिक मानों को संभालने में सक्षम होना चाहिए और uint16_t में टाइप बदलना चाहिए, तो u8 + = 2 काम करेगा, लेकिन u8 = (uint8_t) (u8 + 2) टूटा जाएगा। यह मानते हुए कि चर को u8 नाम नहीं दिया गया है, लेकिन "संख्याऑफ पैराग्राफ", उदाहरण के लिए, यह एक बग हो सकता है जो खोजने में बहुत मुश्किल है।

पहले स्थान पर एक बड़े प्रकार का उपयोग करने के लिए बेहतर है। जब तक आप वास्तव में, वास्तव में स्टोर करना चाहते हैं (u8 + 2) & 0xff, इस मामले में आप इसे इस तरह लिख सकते हैं और समस्याओं के बिना इसे एक बड़े चर में स्टोर कर सकते हैं।

(व्यक्तिगत तौर पर मैं जैसे

(uint8_t)u8 += 2; 
अर्थ विज्ञान है कि अपने स्वयं के प्रकार के लिए एक lvalue कास्टिंग कोई प्रभाव नहीं है के साथ

भाषा के लिए एक विस्तार चाहते हैं और जब तक चेतावनी निकाल, लेकिन एक lvalue कास्टिंग यह एक lvalue बनी हुई है एक अलग प्रकार के लिए एक त्रुटि होगी। यह संकलक चेतावनी को बंद करने के लिए सुरक्षित बनाएगा)

संबंधित मुद्दे