2013-04-02 5 views
5

मैं एक हेडर फाइल "USpecs.h" है।के एकाधिक परिभाषा "..." ग

लेकिन जब मैं इसे बनाने निम्न त्रुटि होती है:

Ucak.cpp | 6 | `UcakSpecs 'के कई परिभाषा |

जैसा कि मैंने पहले खोजा था, यह #ifndef के साथ ठीक होना चाहिए लेकिन यह नहीं है।

+0

कृपया दिखाने सीपीपी कोड फ़ाइल –

+0

नहीं है एक

इसके बजाय, आप शीर्ष लेख में एक घोषणा करना चाहिए था पहले "शामिल" पर टाइपो। साथ ही, यदि यह 'Specs.h' नहीं है (क्योंकि आप इसे शामिल कर रहे हैं), यह क्या है? – slezica

उत्तर

8

इसमें गार्ड केवल एक ही अनुवाद इकाई के भीतर कई परिभाषाओं को रोकते हैं (यानी इसके शामिल हेडर के साथ एक एकल स्रोत फ़ाइल)। जब आप एकाधिक स्रोत फ़ाइलों से हेडर शामिल करते हैं तो वे कई परिभाषाओं को नहीं रोकते हैं।

extern std::vector<Specs*> UcakSpecs; 

और एक (और केवल एक) स्रोत फ़ाइल में एक परिभाषा:

std::vector<Specs*> UcakSpecs; 
+0

यह काम करता है। धन्यवाद। – mucisk

4

समावेशन गार्ड केवल एक ही अनुवाद इकाई में एक से अधिक अनुवाद इकाई को शामिल करने से रोकते हैं। यदि आप इस शीर्षलेख को एकाधिक अनुवाद इकाइयों में शामिल करते हैं, तो आपके पास कार्यक्रम में UcakSpecs की कई परिभाषाएं होंगी।

तरह से एक वैश्विक चर घोषित करने के लिए हेडर फाइल में extern के रूप में यह घोषणा करने के लिए है:

#ifndef USPECS_H 
#define USPECS_H 
#inclde "Specs.h" 


#include <iostream> 
#include <vector> 

extern std::vector<Specs*> UcakSpecs; 

#endif 

एक वैश्विक चर extern के रूप में घोषित केवल एक घोषणा है।

फिर सुनिश्चित करें कि इसे केवल एक अनुवाद फ़ाइल में परिभाषित किया गया है जो इसे कार्यान्वयन फ़ाइल में परिभाषित कर रहा है (शायद USpecs.cpp में);

std::vector<Specs*> UcakSpecs; 
3

#ifndef केवल एक संकलन इकाई पर लागू होता है। चूंकि आपके पास दो (मुख्य कार्य और Ucak वर्ग) हैं, इसलिए चर को दो बार परिभाषित किया गया है।

हेडर फाइल में extern के रूप में चर घोषित करने पर विचार करें:

extern std::vector<Specs*> UcakSpecs; 

और Ucak.cpp फाइल के अंदर यह परिभाषित करने:

std::vector<Specs*> UcakSpecs; 

यह काम करना चाहिए।

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