2009-01-22 8 views
14

का उपयोग करके देखा गया नाम क्या इस चेतावनी के बारे में चिंता करने के लिए कुछ भी है? मैंने पढ़ा है कि यह अनियमित व्यवहार कर सकता है?चेतावनी C4099: पहले 'टाइप' का उपयोग करके देखा गया नाम 'स्ट्रक्चर' (एमएस वीएस 2 के 8)

यह एक उदाहरण है जिसे मैं संकलित करने की कोशिश कर रहा हूं, क्या कोई मुझे समझा सकता है कि लेखक ऑब्जेक्ट को कक्षा के रूप में क्यों घोषित करता है लेकिन फिर टाइपिफ़ इसे संरचना में करता है? क्या यह कक्षा पूरी तरह से सामान्य है यदि कक्षा POD है?

धन्यवाद।

उत्तर

23

यह चेतावनी तब दिखाई देती है जब आपके पास एक प्रकार की घोषणा होती है जो एक दूसरे के विपरीत होती है (एक "वर्ग" कहता है, दूसरा कहता है "संरचना")। एक परिभाषा नियम को देखते हुए, अधिकांश घोषणाओं को छोड़कर सभी घोषणाएं आगे की घोषणाएं होनी चाहिए। चेतावनी आम तौर पर इंगित करेगी कि एक प्रकार की अग्रेषित घोषणा गलत है और आमतौर पर एक साधारण टाइपो होती है और इसे ठीक किया जाना चाहिए। इस मामले में कोई दुष्प्रभाव नहीं होना चाहिए, लेकिन आपको वास्तव में इसे ठीक करना चाहिए।

हालांकि, यदि आपके पास टाइप नाम संघर्ष (शायद नामस्थान का उपयोग करके "क्लॉज या वैश्विक नेमस्पेस प्रदूषण का उपयोग करके) कुछ बहुत ही ग़लत चीजें होती हैं, तो हो सकता है। ये चेतावनियां यह इंगित कर सकती हैं कि आप दो अलग-अलग पुस्तकालयों से हेडर मिश्रण कर रहे हैं और प्रकार के नामों में संघर्ष हैं। इन शर्तों के तहत संकलित कोड कुछ बहुत ही अप्रत्याशित चीजें कर सकता है।

मेरी सलाह - समझें कि चेतावनी क्यों दिखाई दी है और इसे ठीक कर दिया गया है। अगर चेतावनी किसी तीसरे पक्ष के उत्पाद में है, तो जोर देकर कहते हैं कि वे इसे ठीक करते हैं।

+0

महान सलाह, धन्यवाद। –

+2

एमएस मंगल योजना http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling#Data_Type: 'यूनियन 'को' यू 'के रूप में एन्कोड किया गया है,' संरचना 'को' यू 'और' वर्ग' के रूप में' वी 'के रूप में एन्कोड किया गया है। । –

+0

धन्यवाद! , मुझे एक टाइपपीफ संरचना मिल सकती है ..., जिससे मुझे यह चेतावनी मिलती है। – HadesDX

1

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

+1

विभिन्न नाम मैंगलिंग एल्गोरिदम के साथ कंपाइलर्स पर बुरा हो सकता है। – MSalters

0

सी ++ में केवल कक्षा और संरचना के बीच अंतर यह है कि कक्षा के सदस्य और कार्य डिफ़ॉल्ट रूप से निजी होते हैं, जबकि एक संरचना में वे डिफ़ॉल्ट रूप से सार्वजनिक होते हैं; इसलिए, तथ्य यह है कि कक्षा पीओडी है, यहां कोई फर्क नहीं पड़ता है।
मुझे लगता है कि यह चेतावनी कोड रखरखाव (परिभाषा कहीं और अपडेट की गई है) से आती है, और कोड को ठीक करें ताकि चेतावनी गायब हो जाए (उदाहरण के लिए टाइपपीफ में कक्षा का उपयोग करना)।

4

बस एमएसल्टर्स द्वारा this के ऊपर शीर्ष स्तर पर टिप्पणी करने के लिए टिप्पणी लाने के लिए। मुझे नामों के उलझन में 'कक्षा' या 'संरचना' कीवर्ड का उपयोग करके वीसी के परिणामस्वरूप लिंकर त्रुटियों को खोजने में कई कठिनाई हुई है।

यदि आप किसी समस्या की अपेक्षा नहीं करते हैं तो आपको घंटों तक अपने सिर को खरोंच छोड़ दिया जा सकता है!

1

रिचर्ड कॉर्डन सही है - एमएस में यह चेतावनी है कि एक कारण है। सजाए गए (उलझन) नामों में एक वर्ग का नाम (वर्ग या वर्ग) एक प्रकार का नाम शामिल है। यदि कोई फ़ंक्शन या विधि जो किसी ऑब्जेक्ट को तर्क के रूप में लेती है या उस ऑब्जेक्ट को लौटाती है तो गलत क्लास कुंजी दिखाई देने पर कहीं संदर्भित किया जाता है, तो आपको संकलन त्रुटि नहीं मिलेगी लेकिन लिंकर शिकायत करेगा क्योंकि सजाए गए नाम अलग-अलग हैं। लिंकर त्रुटि केवल उस प्रतीक को दिखाती है जिसे वह ढूंढ रहा है, और क्लास कुंजी विसंगति को नजरअंदाज करना आसान है, इसलिए पहले, अधिक विस्तृत कंपाइलर चेतावनी मूल्यवान है। यह अभी भी संभव है कि दो संस्करण एक ही संकलन इकाई में दिखाई नहीं देते हैं, और यदि आप मानते हैं कि केवल अंतर ही डिफ़ॉल्ट सदस्य दृश्यता है तो आप शायद थोड़ी देर के लिए अपने सिर को खरोंच कर रहे होंगे।

+0

क्या यह अभी भी नए एमएसवीसी कंपाइलर्स पर सच है? या 'वर्ग' और 'स्ट्रक्चर' वास्तव में नाम के लिए वास्तव में बराबर है? –

2

मैं अपने ब्लॉग पोस्टिंग में गहराई से इस चेतावनी पर चर्चा करता हूं "Is C4099 really a sillywarning?"। मेरा निष्कर्ष यह है कि यह सबसे अच्छा बंद है। :-) ठीक है, कम से कम मेरे लिए।

1

एक बात मैंने देखा है जो इस चेतावनी को डीएलएल से .tlb फ़ाइल को आयात करने की कोशिश कर रहा है जबकि आपके प्रोजेक्ट में संदर्भ के समान डीएलएल भी है। मैंने अपनी परियोजना के भीतर से संदर्भ के रूप में डीएलएल को हटाकर इसके साथ एक समस्या तय की है।

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