2013-03-04 21 views
10

में परिभाषित किया गया है जो मैं समझता हूं, यह त्रुटि हेडर गार्ड का उपयोग करके ठीक से नहीं होती है जब आपके पास एक ही फ़ाइल सहित कई फ़ाइलें होती हैं। मेरे मामले में, यह है कि जिसके कारण त्रुटि पेड़ शामिल है:फ़ंक्शन पहले से ही .obj

blahblah.obj: error LNK2005: class some::namespace::ObjectType Object already 
    defined in dialogDlg.obj 

मैं बस:

File A includes Z, which contains the functions I need. File B includes A, and file C includes A.

किसी भी #pragma once के बिना, कार्यक्रम एक ही गलती के रूपांतरों का एक समूह देता है आश्चर्यचकित था, मैंने वर्णित पेड़ को शामिल किया है, इसे ठीक से संकलित करने का उचित तरीका क्या है?

मैंने फ़ाइल जेड पर #pragma once का उपयोग करने का प्रयास किया, लेकिन यह काम नहीं किया। मैंने फ़ाइल ए पर एक बार #pragma भी कोशिश की, जो भी काम नहीं किया। आखिर में मैंने ए और जेड दोनों पर कोशिश की, यह भी काम नहीं किया।

+0

कुछ मेरे विचार आप अलग हेडर फाइल उपयोग नहीं कर रहे देता है ?? –

उत्तर

12

ऐसा लगता है कि आप को एक शीर्ष फ़ाइल में एक चर परिभाषित करने की कोशिश कर रहे हैं। यदि वह हेडर फ़ाइल कई स्रोत फ़ाइल में शामिल है, तो यह आपको प्रत्येक स्रोत फ़ाइल में परिभाषित कर देगा जिससे आपको त्रुटि मिलती है।

इसके बजाय घोषित करें extern और फिर अपनी स्रोत फ़ाइलों में से एक में परिभाषित करें।

तो हेडर फाइल में:

extern ObjectType Object; 

और एक स्रोत फ़ाइल में:

ObjectType Object; 
+2

मैं बस इतना जोड़ूंगा कि इसमें गार्ड शामिल करने के लिए कुछ भी नहीं है। गार्ड को एक स्रोत फ़ाइल * एकाधिक समय में एक ही शीर्षलेख को रोकने में मदद करने के लिए सहायता करें। * हम * अलग * स्रोत फ़ाइलों में शामिल होने से समस्या बनाने वाले शीर्षलेख को देख रहे हैं। – Angew

+0

ठीक है तो अगर मुझे फ़ाइल बी और फ़ाइल सी (दोनों। सीपीपी फाइल) दोनों में इन चर और ऑब्जेक्ट तक पहुंच की आवश्यकता है, तो क्या यह स्पष्ट रूप से हासिल करने का कोई तरीका है? – xcdemon05

+1

जब तक आप एक साथ b.cpp और c.cpp संकलित करते हैं, तब तक यह समाधान पहले से ही प्राप्त करता है जो आप चाहते हैं। – us2012

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