2011-08-24 28 views
13

विज़ुअल सी ++ deprecated में /Wp64 ध्वज क्यों है?क्यों/Wp64 बहिष्कृत है?

सीएल: कमांड लाइन चेतावनी D9035:
विकल्प 'Wp64' पदावनत किया गया है और एक भविष्य के रिलीज में हटा दिया जाएगा

उत्तर

15

मुझे लगता है कि /Wp64 बहिष्कृत हो गई है जिसका मुख्य कारण एक 64-बिट लक्ष्य के लिए संकलन त्रुटियों यह पकड़ने के लिए डिजाइन किया गया था के प्रकार पकड़ेगा (/ Wp64 32-बिट compiles में ही मान्य है)। विकल्प को वापस जोड़ा गया था जब 64-बिट लक्ष्य उभर रहे थे ताकि लोग अपने प्रोग्राम को 64-बिट पर माइग्रेट कर सकें और '64 -bit clean' कोड का पता लगाने में सहायता कर सकें।

यहाँ /Wp64 के साथ समस्याओं के प्रकार का एक उदाहरण है कि माइक्रोसॉफ्ट सिर्फ फिक्सिंग में कोई दिलचस्पी नहीं है - शायद (http://connect.microsoft.com/VisualStudio/feedback/details/502281/std-vector-incompatible-with-wp64-compiler-option से) सही भी:

वास्तव में, एसटीएल /Wp64 साथ जानबूझकर असंगत नहीं है, न ही यह /Wp64 के साथ पूरी तरह से और बिना शर्त असंगत है। अंतर्निहित समस्या यह है कि /Wp64 टेम्पलेट्स के साथ अत्यंत बुरी तरह से इंटरैक्ट करता है, क्योंकि __w64 टाइप सिस्टम में पूरी तरह से एकीकृत नहीं है। इसलिए, vector<unsigned int>vector<__w64 unsigned int> से पहले तत्काल है, तो उनमें से दोनों vector<unsigned int>, और इसके विपरीत व्यवहार करेंगे। X86 पर, SOCKET__w64 unsigned int के लिए एक टाइपिफ़ है। यह स्पष्ट नहीं है, लेकिन vector<unsigned int> को आपके vector<SOCKET> से पहले को तत्काल किया जा रहा है, क्योंकि vector<bool> का समर्थन किया गया है (हमारे कार्यान्वयन में) vector<unsigned int> द्वारा।

पहले (वीसी 9 और पहले में), /Wp64 और टेम्पलेट्स के बीच यह खराब बातचीत नकली चेतावनी का कारण बनती है। वीसी 10 में, हालांकि, में परिवर्तन एसटीएल ने इसे और भी खराब कर दिया है। अब, जब vector::push_back() को वेक्टर का एक तत्व दिया गया है, तो यह अन्य काम करने से पहले तत्व की अनुक्रमणिका को दर्शाता है। यह सूचकांक वेक्टर की शुरुआत से तत्व के पते को घटाकर प्राप्त किया जाता है।आपके रेपो में, इसमें const SOCKET * - unsigned int * घटाना शामिल है। (उत्तरार्द्ध पहले बताए बग के कारण unsigned int * और नहीं SOCKET * है।) यह// एक नकली चेतावनी उत्प्रेरित करने चाहिए, कि "मैं घटाकर संकेत दिए गए कि 86 पर एक ही प्रकार को इंगित, पर हूँ लेकिन विभिन्न प्रकार के 64 "। हालांकि, यहां एक दूसरा बग है, जहां /Wp64 वास्तव में भ्रमित हो जाता है और सोचता है कि यह एक कठिन त्रुटि है ( unsigned int * पर स्थिरता जोड़ना)।

हम मानते हैं कि यह फर्जी त्रुटि संदेश भ्रमित है। हालांकि, के बाद से यह एक अनियमित कमांड लाइन बहिष्करण चेतावनी D9035 से पहले है, हम मानते हैं कि यह पर्याप्त होना चाहिए। D9035 पहले से ही कहता है कि /Wp64 का उपयोग नहीं किया जाना चाहिए (हालांकि यह कहने वाला नहीं है "यह विकल्प सुपर डुपर छोटी गाड़ी है, और अब पूरी तरह से अनावश्यक है")।

एसटीएल में, हम #error/Wp64 का उपयोग कर सकते हैं। हालांकि, उन ग्राहकों को तोड़ देगा जो अभी भी /Wp64 ( बहिष्करण चेतावनी के बावजूद) के साथ संकलित कर रहे हैं और इस फर्जी त्रुटि को ट्रिगर नहीं कर रहे हैं। एसटीएल भी एक चेतावनी उत्सर्जित कर सकता है, लेकिन संकलक पहले ही डी 0 9 35 उत्सर्जित कर रहा है।

+0

अहह अब * यह * एक दृढ़, उचित उत्तर है !! इसे पोस्ट करने के लिए बहुत बहुत धन्यवाद! :) +1 – Mehrdad

+0

वास्तव में गलत: "64-बिट लक्ष्य के लिए संकलन उन त्रुटियों को पकड़ लेगा जिन्हें इसे पकड़ने के लिए डिज़ाइन किया गया था (/ Wp64 केवल 32-बिट संकलन में मान्य है)" ... VS2010/SP1 पर आपको निर्दिष्ट करना होगा '/ Wp64' x64 में भी बनाता है यदि आप 'C4311' (जो * बेहद सहायक है) प्राप्त करना चाहते हैं। उपयोगकर्ता 13251 लासो ने इसका जवाब अपने जवाब में दिया है। –

2

क्योंकि जब VS2010 से 64 बिट संकलक का उपयोग कर संकलक का पता लगाने करता है स्वचालित रूप से 64 बिट समस्याओं की ... इस स्विच जब आप 64 बिट समस्या 32 बिट संकलक चल पता लगाने के लिए कोशिश कर सकते वापस दिन में से है ...

देखें http://msdn.microsoft.com/en-us/library/yt4xw8fh%28v=VS.100%29.aspx

+0

गलत। वीएस -2010 के लिए * कम से कम * पर। डॉक्स टूटा हुआ है। –

0

आप बहिष्करण चेतावनी से लिंक कर सकते हैं, लेकिन /Wp64 दस्तावेज़ीकरण पर नहीं जा सका?

डिफ़ॉल्ट रूप से,/Wp64 संकलक विकल्प विजुअल सी ++ 32-बिट कंपाइलर में और विजुअल सी ++ 64-बिट कंपाइलर में बंद है।

यदि आप नियमित रूप से 64-बिट कंपाइलर का उपयोग करके अपने एप्लिकेशन को संकलित करते हैं, तो आप अपने 32-बिट संकलन में बस/Wp64 अक्षम कर सकते हैं क्योंकि 64-बिट कंपाइलर सभी समस्याओं का पता लगाएगा।

जोर जोड़ा

+0

तो वे इसे सिर्फ इसलिए बर्बाद कर रहे हैं क्योंकि यह 100% मूर्ख नहीं है? मैंने कल्पना की कि वास्तव में इसके साथ कुछ * गलत * होना चाहिए, न केवल यह तथ्य कि यह सभी मुद्दों का पता नहीं लगा सकता है (यह 64-बिट कंपाइलर की तरह नहीं है, सभी मुद्दों का पता लगा सकता है) ... – Mehrdad

+0

@Mehrdad - वे हैं इसे छोड़कर क्योंकि 64-बिट कंपाइलर एक गैर-वैकल्पिक आधार पर वही काम करता है। –

+0

शायद यह सिर्फ मुझे है, लेकिन मुझे यह विश्वास नहीं है, क्षमा करें। – Mehrdad

4

/32-बिट बिल्डों पर Wp64 समय की बर्बादी है। यह बहिष्कृत है, और यह बहिष्कार समझ में आता है। जिस तरह से/डब्ल्यूपी 64 32-बिट बिल्डों पर काम करता है वह एक प्रकार पर _w64 एनोटेशन की तलाश करेगा। यह _w64 एनोटेशन संकलक को बताएगा कि भले ही यह 32-बिट मोड में 32-बिट्स है, यह 64-बिट मोड में 64-बिट्स है। यह वास्तव में फ्लेकी हो गया, खासकर जहां टेम्पलेट शामिल हैं।

/64-बिट बिल्ड पर Wp64 बेहद उपयोगी है। प्रलेखन (http://msdn.microsoft.com/en-us/library/vstudio/yt4xw8fh.aspx) दावा करता है कि यह 64-बिट बिल्डों में डिफ़ॉल्ट रूप से चालू है, लेकिन यह सच नहीं है। कंपाइलर चेतावनियां सी 4311 और सी 4312 केवल उत्सर्जित हैं अगर/wp64 स्पष्ट रूप से सेट है। उन दो चेतावनियों से संकेत मिलता है कि जब 32-बिट मान पॉइंटर में रखा जाता है, या इसके विपरीत। ये कोड शुद्धता के लिए बहुत महत्वपूर्ण हैं, और चेतावनी स्तर 1 पर होने का दावा करते हैं। मुझे बहुत व्यापक कोड में बग मिली हैं जो डेवलपर्स 64-बिट बिल्डों के लिए चालू/Wp64 चालू होने पर रोक दिए गए थे। दुर्भाग्यवश, आपको कमांड लाइन चेतावनी भी मिलती है जिसे आपने देखा है। मुझे इस चेतावनी को छेड़छाड़ करने का कोई तरीका नहीं है, और मैंने इसके साथ रहना सीखा है। चमकदार तरफ, यदि आप त्रुटियों के रूप में चेतावनियों के साथ बनाते हैं, तो यह कमांड लाइन चेतावनी त्रुटि में नहीं आती है।

+0

आप '/ w446411/w44312' जैसे कुछ के साथ'/Wp64' का उपयोग किए बिना उन चेतावनियों को सक्षम कर सकते हैं। दस्तावेज भ्रामक है; इसका अर्थ यह है कि उन चेतावनियों को '/ Wp64' द्वारा सक्षम किया गया है, न कि अगर वे 'Wp64' सक्षम हैं तो केवल तभी सक्षम किया जा सकता है।अफसोस की बात है कि "चेतावनियां" की कोई सूची नहीं है जो सामान्य रूप से सक्षम होती हैं जब '/ Wp64' सक्षम होती है" और वे "चेतावनियां जो डिफ़ॉल्ट रूप से नहीं हैं" की सूची में दिखाई नहीं देती हैं, इसलिए हमें खोजने के लिए एमएसडीएन चुनने के लिए छोड़ दिया जाता है उन्हें :( –

+0

@ बेनहेमर्स - जहां तक ​​मैं कह सकता हूं, ** VS2010 ** ** * सी 4311' (यहां तक ​​कि x64 बिल्ड पर) प्राप्त करने के लिए * केवल * तरीका '/ Wp64' निर्दिष्ट करना है। मुझे लगता है कि उपयोगकर्ता 13251 की सलाह स्पॉट है चालू। ('/ w44311' * मेरे वीएस -2010 पर मेरे लिए काम नहीं करता है, न ही संबंधित 'प्रगमा चेतावनी') –

+0

@ मार्टिनबा - अच्छी जानकारी, धन्यवाद! मुझे याद नहीं है कि मैं 2014 में किस कंपाइलर का उपयोग कर रहा था लेकिन मैं कल्पना करें कि यह वीएस2012 या वीएस2013 में वर्णित तरीके से काम करता है ... :) उम्मीद है कि 2014 मैं सिर्फ सामान नहीं बना रहा था! –

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