2012-12-06 10 views
10

संभव डुप्लिकेट का उपयोग किए बिना अहस्ताक्षरित पूर्णांक में बदल जाती है: डबल/नाव अहस्ताक्षरित पूर्णांक से
g++ -Wall not warning about double-> int castजी ++ चेतावनी दी है जब डबल/नाव -Wconversion

सवाल here के अनुसार, प्रत्यक्ष रूपांतरण पोर्टेबल नहीं है। मैंने पाया कि मेरे कोड में मेरे कुछ मामले थे जहां ऐसा होता है और अगर मैं ऐसा करता हूं तो मुझे चेतावनी देने के लिए g ++ बताना चाहूंगा, लेकिन मुझे ऐसा कोई विकल्प नहीं मिल रहा है। क्या किसी को पता है कि ऐसा करने का कोई विकल्प है?

नोट: मैं देखता हूं - रूपांतरण, लेकिन यह उन सभी प्रकार के अन्य रूपांतरणों के बारे में भी चेतावनी देता है जिनकी मुझे परवाह नहीं है (जैसे int को बिना हस्ताक्षर किए गए int को परिवर्तित करना, जो मानक के अनुसार पोर्टेबल है)।

संपादित करें: यहाँ एक कोड उदाहरण है जिसके लिए मैं एक चेतावनी देखना चाहेंगे है:

double dblNumber = -234; 
unsigned long uintNumber = dblNumber; 

जी ++ का एक संस्करण पर, यह मुझे 0xFFFFFF16 (जो 2 के पूरक में -234 है) के एक पूर्णांक मूल्य देता है । दूसरे पर यह मुझे 0. देता है। स्पष्ट रूप से कोड संदिग्ध है, यही कारण है कि इसे समझ में नहीं आता है पोर्टेबल माना जाता है।

+0

@ डीजेक्लिन: * "नोट: मैं देखता हूं - रूपांतरण, लेकिन यह उन सभी प्रकार के अन्य रूपांतरणों के बारे में भी चेतावनी देता है जिनकी मुझे परवाह नहीं है (जैसे int को बिना हस्ताक्षर किए गए int को परिवर्तित करना, जो मानक के अनुसार पोर्टेबल है)।" *। – Zeta

+0

मैं मानता हूं कि मुझे वह अन्य प्रश्न नहीं दिखाई देता है, लेकिन यह वास्तव में -वोनवर्जन का उपयोग न करने का पता नहीं लगाता है। यह अजीब लगता है कि मैं डिफ़ॉल्ट रूप से इसके बारे में चेतावनी नहीं देता, खासकर जब से g ++ के विभिन्न संस्करण अलग-अलग कार्यान्वयन को चुपचाप विफल करने के कारण अलग-अलग प्रतिक्रिया देते हैं। – KyleL

+0

@KdawgUD क्या आप कोड का एक उदाहरण टुकड़ा दिखा सकते हैं? सुनिश्चित नहीं है कि आप वास्तव में रूपांतरण कैसे करते हैं।जब भी आप स्पष्ट रूप से एक प्रकार से दूसरे में डाले जाते हैं, उदाहरण के लिए 'un_signed_int_value = (unsigned int) double_value;' आप कंपाइलर को बता रहे हैं * मुझे पता है कि मैं क्या कर रहा हूं *। तो मुझे नहीं लगता कि क्यों संकलक इस तरह के रूपांतरणों के बारे में चेतावनी देगा। वास्तव में, अगर कोई था तो स्पष्ट कास्ट किसी भी चेतावनी को दबा देगा। जब तक मैं आपके प्रश्न को गलत नहीं समझता, आप जो भी पूछ रहे हैं वह संभव नहीं है। –

उत्तर

1

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

तो ++ जी द्वारा प्रदान की केवल उपकरण -Wconversion है, शायद आप अपनी सुविधा के लिए चेतावनी को फ़िल्टर करने के अपने खुद के उपकरण बनाने चाहिए (मैं हमेशा की तरह sed में सोच रहा हूँ, awk, पर्ल या php, लेकिन यह आपके सिस्टम पर इन उपकरणों की उपलब्धता पर निर्भर करता है, और यदि आप एक का उपयोग करते हैं तो आप सीधे अपने आईडीई से कुछ ऐसा कर सकते हैं)।

आप रूपांतरण फ़ाइलों को विशिष्ट फ़ाइलों या यहां तक ​​कि विशिष्ट कोड भागों तक सीमित करने के लिए जीसीसी के specific pragma directives का भी उपयोग कर सकते हैं।

आपके कोड में पिनपॉइंट करने के लिए उपयोग की जाने वाली कोई अन्य प्रोग्रामेटिक विधि जहां समस्याग्रस्त रूपांतरणों का निश्चित रूप से स्पष्ट कास्ट डालने के लिए उपयोग किया जा सकता है, जो लक्ष्य है जिसका लक्ष्य होना चाहिए।

4

मैं जानता हूँ कि आप ने कहा आप -Wconversion का उपयोग नहीं करना चाहते हैं, लेकिन यह समस्या के बारे में आपको चेतावनी देते हैं, और जब longunsigned long (उदाहरण के लिए) को परिवर्तित करने में कम से कम छ में ++ 4.5 चेतावनी दी है नहीं करता है। किसी अन्य मामले के लिए यह चेतावनी देता है कि आप कानूनी वांछित रूपांतरण कहां कर रहे हैं, बस इसे डालें। आपके भावी रखरखाव आपको स्पष्ट रूप से स्पष्ट करने के लिए बहुत धन्यवाद देंगे कि अनुमानित रूपांतरण किया जा रहा है यह अनुमान लगाने के बजाय किया जा रहा है कि यह जानबूझकर है या कोड संदर्भ से नहीं।

+0

मैं 100% सहमत हूं कि स्पष्ट रूप से रूपांतरण बेहतर हैं। मैं बस अपने निर्माण प्रणाली को स्थापित करने का एक तरीका ढूंढने की उम्मीद कर रहा था जैसे कि यदि मैं गलती से हस्ताक्षर किए गए रूपांतरण के लिए एक अंतर्निहित डबल करता हूं तो यह दरारों के माध्यम से पर्ची नहीं करेगा और अनजान नहीं होगा। मेरी परियोजना के लिए, दुर्भाग्यवश, Wconversion द्वारा उत्पादित चेतावनियां उपयोगी होने के लिए बहुत अधिक हैं। – KyleL

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