2012-03-06 11 views
15

के कारण - मैं एनएसईआरआरआर में त्रुटि डोमेन के रूप में उपयोग करने के लिए एनएसएसटींग को परिभाषित कर रहा था और यह कॉपी कर रहा था कि ASIHttpRequest कैसा चल रहा था।एलडी: डुप्लिकेट प्रतीक -

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 

मैं अपनी ही ज फ़ाइल // FPServerAPICoordinatorConstants.h

#ifndef FirePlayer_FPServerAPICoordinatorConstants_h 
#define FirePlayer_FPServerAPICoordinatorConstants_h 

NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 

#endif 

में स्थिरांक डाल लेकिन जब मैं एक से अधिक मीटर

SomeFile.m 

#import "FPServerAPICoordinatorConstants.h" 

SomeOtherFile.m 

#import "FPServerAPICoordinatorConstants.h" 

में शामिल मुझे मिल गया लिंकर त्रुटि 'डुप्लिकेट प्रतीक'

ld: duplicate symbol _FPServerAPIErrorDomain in SomeFile.o and ....SomeOtherFile.o for architecture armv7 

इसलिए मैं कॉन्स को #define में बदलता हूं और यह ठीक काम करता है।

// FPServerAPICoordinatorConstants.h 

#ifndef FirePlayer_FPServerAPICoordinatorConstants_h 
#define FirePlayer_FPServerAPICoordinatorConstants_h 


//THIS WAS TRIGGERING link errors 
//NSString* const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 
//working OK 
#define FPServerAPIErrorDomain @"FPServerAPIErrorDomain" 

#endif 

लेकिन क्या वैश्विक अंतरिक्ष में स्थिरता को 'डुप्लिकेट प्रतीक' फेंकने का कोई तरीका नहीं है?

+2

यदि आप फ़ाइल जादू शामिल करते हैं, तो आपका प्रश्न वही है: "क्या मैं ** कॉन्स int i = 42; ** एक ही स्रोत/बाइनरी में दो बार कर सकता हूं? –

+0

हाँ लेकिन यह भी कि आप कैसे नहीं करते #defines का उपयोग करें और वैश्विक अंतरिक्ष में कॉन्स का उपयोग करें? क्या यह संभव है? क्या यह पसंद किया गया है? # परिभाषित काम करता है लेकिन फिर क्यों है? मैं एक जावा व्यक्ति ओबज-सी में स्थानांतरित हो गया हूं, मैं वूडू 101 में अभी तक योग्य हूं –

+0

आपने कॉपी नहीं किया है ASIHttpRequest बिल्कुल क्या कर रहा है वापस जाएं और फिर से देखो – hooleyhoop

उत्तर

47

अपने हेडर फाइल में आप चाहते हैं:

extern NSString *const FPServerAPIErrorDomain; 

और फिर एक कार्यान्वयन फ़ाइल में (ताकि शायद आप एक FPServerAPICoordinatorConstants.m चाहते हैं) आप चाहते हैं जाएगा:

NSString *const FPServerAPIErrorDomain = @"FPServerAPIErrorDomain"; 

तो फिर तुम में हैडर आयात कर सकते हैं एकाधिक फ़ाइल और डुप्लिकेट प्रतीक त्रुटियां नहीं मिलती हैं।

[वैसे, आप #ifndef गार्ड अगर आप #import उपयोग कर रहे हैं की जरूरत नहीं है।]

+0

हा एपी! कृपया ifndef में डाल दें :) जब मैंने टेम्पलेट्स –

+0

से हेडर फ़ाइल जोड़ा तो शायद यह है कि आपने "सी हेडर" टेम्पलेट से जोड़ा है।यदि आप सी-स्टाइल '# शामिल हैं' का उपयोग करते हैं, तो उन्हें डिफ़ॉल्ट रूप से उनके रूप में रखा जाएगा। लेकिन आप उद्देश्य-सी-शैली '# आयात का उपयोग कर रहे हैं। तो गार्ड से छुटकारा पाएं। – mattjgalloway

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। मेरे लिए समय बचाओ – Yanhua

3

उसी नामस्थान में दो बार (वैश्विक) चर को तुरंत चालू करना संभव नहीं है (बिना त्रुटि के)।

+1

वहाँ // NSString * स्थिरांक FPServerAPIErrorDomain = @ "FPServerAPIErrorDomain" का उपयोग कर के किसी भी लाभ है,।। से अधिक #define FPServerAPIErrorDomain @ "FPServerAPIErrorDomain" –

1

प्रत्येक प्रतीक केवल एक बार परिभाषित किया जाना चाहिए; यानी, इसे केवल एक एम फ़ाइल में परिभाषित किया जाना चाहिए। परिभाषा को हेडर फ़ाइल में डालकर, यह प्रत्येक एम फ़ाइल में परिभाषित हो जाता है जिसमें हेडर शामिल होता है।

इसे अपनी एम फाइलों में से किसी एक में परिभाषित करें (जो भी सबसे प्रासंगिक है), और घोषणा के लिए शीर्षलेख में आपके पास क्या है (बाहरी कीवर्ड का उपयोग करके)।

परिभाषा डेटा के लिए जगह बनाता है; घोषणा बस संकलक को बताती है कि कहीं और परिभाषा है। इसलिए निरंतर उपयोग करने वाली प्रत्येक एम फ़ाइल में घोषणा की आवश्यकता होती है, लेकिन केवल एक एम फ़ाइल में परिभाषा होनी चाहिए।

+0

// NSString * const FPServerAPIErrorDomain = @ "FPServerAPIErrorDomain" का उपयोग करने का कोई फायदा है; # परिभाषित करें FPServerAPIErrorDomain @ "FPServerAPIErrorDomain" –