2012-12-05 25 views
5

त्वरित प्रश्न - के बजाय == के उपयोग के लिए कोई अच्छा तरीका है?inadvertent ऑब्जेक्ट पॉइंटर तुलना कैसे प्राप्त करें?

पूरी कहानी:

typedef long DataKey; 

DataKey x; 
DataKey y; 

if (x == y) { 
    // do stuff 
} 

मैं अब एक वस्तु के साथ मेरी DataKey के लिए एक long का उपयोग कर को बदलने के लिए एक की जरूरत है:

मैं कोड का एक समूह एक तरह से इस तरह था। वर्ग वैश्विक खोज और की जगह का एक समूह बनाने और करने के बाद, मेरे कोड अब इस तरह तरह का है:

@interface DataKey : NSObject 

DataKey *x; 
DataKey *y; 

if (x == y) { // uh-oh - this is now bad 
    // do stuff 
} 

वहाँ एक चेतावनी मैं संकलक कि संकेत में अदिश ऑपरेटर्स का उपयोग कर के बारे में चेताते में सक्षम कर सकते हैं है? मैं एलएलवीएम 4.1 कंपाइलर के साथ एक्सकोड 4.5.2 का उपयोग कर रहा हूं। मैं एक खोजने में सक्षम नहीं हूं।

इस कोड को ठीक करने में मदद करने के लिए कोई अन्य सुझाव? यह एक मामूली कोड आधार नहीं है। सौदा करने के लिए सैकड़ों स्रोत फाइलें हैं। यह एक प्रमुख रिफैक्टरिंग प्रयास है।

संपादित करें:

यह महान अगर वहाँ ज्यादा है जब आप के बजाय एक if हालत की तुलना में काम का उपयोग जैसा एक चेतावनी थी होगा। आप इसके लिए चेतावनी प्राप्त कर सकते हैं और चेतावनी को रोकने के लिए कंस्ट्रैसिस का उपयोग कर सकते हैं।

अद्यतन:

टिप्पणी में एक सुझाव के आधार पर, मैं एक परीक्षण परियोजना के लिए -Weverything संकलक विकल्प जोड़ा। == के साथ दो ऑब्जेक्ट पॉइंटर्स की तुलना करते समय यह वांछित परिणाम उत्पन्न नहीं करता था।

शायद operator== विधि को अधिभारित करने के लिए सी ++ का संयोजन, और उस ऑपरेटर का उपयोग करने का प्रयास करते समय कुछ कंपाइलर चेतावनी/त्रुटि प्राप्त की जा सकती है। मैं इस विकल्प पर केंद्रित एक और सवाल पोस्ट कर सकता हूं।

+0

अच्छा सवाल। कैसे [जांच कर रहा है कि यह एक वैध सूचक है] (http://www.cocoawithlove.com/2010/10/testing-if-arbitrary-pointer-is-valid.html) और फिर कस्टम कंपाइलर चेतावनी को ' कुछ पाठ चेतावनी '। सुनिश्चित नहीं है कि आप जो खोज रहे हैं। – iDev

+0

@ACB मुझे यकीन नहीं है कि उस लिंक की जानकारी यहां कैसे लागू की जा सकती है। मैं (आदर्श) एक संकलन समय की जांच कर रहा हूं। वह लिंक रनटाइम चेक के लिए है। – rmaddy

+0

यह एक उचित संकलक विकल्प होगा, लेकिन मैंने कभी ऐसा नहीं देखा है, और मैं किसी भी मैक्रो चाल या त्रुटियों को बल देने के बारे में सोच नहीं सकता। –

उत्तर

2

मैं पूरी तरह से सुनिश्चित ऐसी कोई चेतावनी नहीं है हूँ समानता के लिए संकेत की तुलना के रूप में बहुत आम है और नहीं सब जो सामान्य रूप से गलती से। दुर्भाग्यवश आपकी सबसे अच्छी शर्त किसी भी जगह से गुजरना होगा डेटाकेस का इस तरह इस्तेमाल किया जा सकता है और == की खोज हो सकती है। बहुत मजेदार नहीं, मुझे पता है।

+3

एसओ पर नौसिखिया प्रश्नों की संख्या के आधार पर जहां वे '==' का उपयोग करके दो 'एनएसएसटींग' वस्तुओं की तुलना करने का प्रयास करते हैं, मुझे असहमत होना होगा कि गलती से '==' का उपयोग करना आम नहीं है। मैं शर्त लगाता हूं कि तुलनात्मक रूप से एक शर्त में असाइनमेंट का उपयोग करके गलती से सामान्य है और उस मुद्दे के लिए कंपाइलर समर्थन है। – rmaddy

+2

@rmaddy: मुझे लगता है कि चक का मतलब है कि समानता के लिए पॉइंटर्स की तुलना करना भी बहुत आम है; जबकि एक सशर्त बयान में असाइनमेंट * आमतौर पर * एक गलती है। – mipadi

+0

@ मिपाडी और मैं कह रहा हूं कि मैं असहमत हूं कि समानता के लिए पॉइंटर्स की तुलना करना आम है। कम से कम अपने कोड में यह बहुत दुर्लभ है। मैं हमेशा यह स्पष्ट करने के लिए एक टिप्पणी जोड़ता हूं कि मैं वास्तव में '==' का उपयोग करके तुलना करने का मतलब करता हूं। वास्तव में, कोड की लगभग 200k लाइनों में, मैं इसे एक बार करता हूं। मुझे कोई संदेह नहीं है कि अन्य लोग इसे अक्सर करते हैं। – rmaddy