2014-10-06 10 views
7

में "Redefinition" और "डुप्लिकेट प्रोटोकॉल" परिभाषा त्रुटियों से कैसे बचें, मैं एक तेज वर्ग में एक ओबीजेसी लाइब्रेरी और ओबीजेसी कक्षा का उपयोग करना चाहता हूं। इसलिए मैं ब्रिजिंग-Header.h में निम्नलिखित जगह:ब्रिजिंग हेडर

#import <FooLibrary/FooLibrary.h> 
#import "FooClass.h" 
समस्या

कि FooClass.h

#import "FooLibrary.h". 

है तो जब मैं संकलन मैं की तरह त्रुटियों के सैकड़ों प्राप्त है: "की पुनर्व्याख्या गणक "और" संपत्ति की पिछली परिभाषा "और" डुप्लिकेट प्रोटोकॉल परिभाषा "और" टाइपपीफ रेडिफिनिशन "

मैं इससे कैसे बचूं? ऐसा लगता है कि यह सिर्फ एक बेवकूफ मानसिक ब्लॉक है जो मैं कर रहा हूं लेकिन मैं इसे पिछले नहीं कर सकता इसलिए मैं पूछ रहा हूं।

PartiallyFinite सुझाव दिया मैं मैं एक परियोजना विस्तृत खोज किया था के लिए #include

देख सकते हैं और मैं और नहीं यह बिल्कुल का उपयोग कर। पुस्तकालय में कुछ हैं। मैंने त्रुटियों में से एक चुना है। फ़ाइल सजावट में है के साथ #include

+1

इसे स्वचालित रूप से टालना चाहिए, क्योंकि '# import' यह सुनिश्चित करता है कि प्रत्येक फ़ाइल केवल एक बार आयात की जाए। क्या आप वाकई इसके बजाय कहीं भी '# शामिल' का उपयोग कर गलती से नहीं हैं? ('# शामिल' में यह सुनिश्चित करने के लिए चेक शामिल नहीं हैं कि फ़ाइलों को केवल एक बार आयात किया जाता है) – Greg

+0

@PartiallyFinite मेरा संपादन देखें। टिप्पणी के लिए धन्यवाद। मैंने इसके लिए जांच नहीं की थी, लेकिन यह अभी भी समस्या प्रतीत नहीं होता है। –

उत्तर

9

कुछ की तरह लगता है किसी भी फ़ाइल में शामिल नहीं किया जाता विश्वास है कि FooLibrary.h हैडर दूसरा #import द्वारा परोक्ष रूप से आयातित किसी भी तरह जिसमें हाल ही में इसके बाद के संस्करण में शामिल हैं के रूप में एक ही फाइल नहीं है पूर्वप्रक्रमक खड़ी कर रहा है यह। मेरा सबसे अच्छा अनुमान यह है कि आपका पहला, फ्रेमवर्क-स्टाइल आयात हेडर फाइलों का संदर्भ दे रहा है जो बिल्ड के दौरान निर्माण स्थान पर कॉपी किए जाते हैं, जबकि आपका दूसरा, प्रत्यक्ष फ़ाइल आयात हेडर फ़ाइल का संदर्भ दे रहा है क्योंकि यह आपकी प्रोजेक्ट निर्देशिका में है , जिसका अर्थ है कि प्रीप्रोसेसर उन्हें दो पूरी तरह अलग फाइलों के रूप में देखता है, जिसके परिणामस्वरूप इसे दो बार आयात किया जा रहा है। कि शायद समस्या ठीक हो जाएगी

  1. आप शामिल कर सकते हैं FooClass.h ढांचे शैली आयात सिंटैक्स का उपयोग (जैसे #import <FooLibrary/FooClass.h>),:

    प्रस्तावित ठीक करने के तरीके।

  2. कि आप सुनिश्चित न कि FooClass.hहमेशा शामिल FooLibrary.h, तो आप शायद सिर्फ पहली आयात पूरी तरह छोड़ सकते हैं, के रूप में सब कुछ एक दूसरे के माध्यम से परोक्ष रूप से आयातित हो जाएगा रहे हैं।

  3. अन्यथा, आप कोशिश कर सकते हैं कुछ अच्छा, पुराने जमाने गार्ड में शामिल हैं (आप यह सोचते हैं पुस्तकालय हेडर की पहुंच है):

    // FooLibrary.h 
    
    #pragma once // Maybe even throw in one of these for good measure; 
          // since we're dealing with an obscure-sounding bug, 
          // may as well try to fix it in all of the possible ways 
    
    #ifndef FOOLIBRARY_IMPORTED 
    #define FOOLIBRARY_IMPORTED 
    ... // actual file contents 
    #endif 
    

    यह एक पूर्वप्रक्रमक मैक्रो पहली बार फ़ाइल आयात किया जाता है परिभाषित करेगा , इसलिए दूसरी बार प्रीप्रोसेसर फ़ाइल आयात करने का प्रयास करता है, पहले से परिभाषित मैक्रो सामग्री को दूसरी बार आयात करने से रोक देगा। मुझे समझ में क्यों #import आपके मामले में यह नहीं कर रहा है विफल, कि सचमुच अपने एकमात्र उद्देश्य और #include पर लाभ है, लेकिन अगर यह यह ठीक करता है, ¯ के रूप में \ _ (ツ) _/¯

+0

1. कक्षा में '#import" FooLibrary.h था। मैंने इसे '# आयात ' में बदल दिया और यह तय किया। (क्या आप # 1 के साथ क्या कहना चाहते थे? यह नहीं है मैं इससे क्या समझता हूं, लेकिन यही कारण है कि मैंने काम करने का प्रयास किया।) –

+0

2. कुछ चेतावनियों के साथ काम किया। मैं कुछ परिदृश्यों के माध्यम से जाऊंगा। परिदृश्य 1 काम किया: '#import 'ब्रिजिंग-हेडर से। परिदृश्य 2 विफल: ब्रिजिंग-हेडर से' #import 'निकालें। FooClass.h में' #import है ब्रिजिंग-हेडर 'AnotherFooClass.h में '#import" FooLibrary.h' है - यह एक ही समस्या उत्पन्न करता है। मैंने कोशिश नहीं की 3. –

+1

@ लुकासगोसेन मैं यही # 1 के साथ कह रहा था। निर्माण के दौरान कहीं भी आपकी हेडर फाइलों की प्रतिलिपि बनाई जा रही है, और यह कॉपी किए गए एक के साथ-साथ मूल को आयात कर रहा था, यह महसूस किए बिना कि वे वही थे। – Greg

3

यह कोकोपोड्स के कारण भी हो सकता है - एक अलग संस्करण में अपग्रेडिंग या डाउनग्रेड करने का प्रयास करें और pod install

+0

मैं कोकोपोड्स का उपयोग कर रहा हूं और 1. ऊपर दिए गए सुझाव में मेरे लिए काम किया – Remover

2

मेरे लिए यह तब हो रहा था जब मैंने एक्सकोड को अपग्रेड किया था। मैंने बस इतना किया कि बिल्ड बिल्ड फ़ोल्डर को साफ करें और फिर से चलाएं और यह काम करता है!

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