2010-08-15 10 views
5

मैं दो .cpp फ़ाइलों के बीच एक ही चर साझा करने की कोशिश कर रहा हूं, उनमें एक ही .h फ़ाइल शामिल है।स्रोत चर के बीच साझा वैश्विक चर के साथ समस्याएं (मैं गार्ड शामिल कर रहा हूं)

लेकिन मुझे त्रुटियों को जोड़ रहा है, मुझे बता रहा है कि मेरे पास कई परिभाषाएं हैं। जो मैं अजीब लगता है, के बाद से मैं गार्ड

//main.cpp 
#include <cstdio> 
#include "shared.h" 

int main(){ 
    shared_int = 5; 
    printVal(); 
    return 0; 
} 


//shared.h 
#ifndef INCLUDE_GUARD_H 
#define INCLUDE_GUARD_H 
#include <cstdio> 
#include <cstdlib> 
int shared_int; 
int printVal(); 
#endif 

//shared.cpp 
#include <cstdio> 
#include "shared.h" 


int printVal(){ 
    fprintf(stderr,"a: %d\n",shared_int); 
    return 0; 
} 

मैं

g++ shared.cpp -c;g++ main.cpp shared.o 
shared.o:(.bss+0x0): multiple definition of `shared_int' 
/tmp/cci8w8Am.o:(.bss+0x0): first defined here 
collect2: ld returned 1 exit status 

धन्यवाद

अद्यतन की तरह comping हूँ शामिल उपयोग कर रहा हूँ: 'निर्वासन' अभी भी काम नहीं करता है, लेकिन अब मैं एक अपरिभाषित संदर्भ प्राप्त करें ये अद्यतन फ़ाइलें

//shared.h 
#ifndef INCLUDE_GUARD_H 
#define INCLUDE_GUARD_H 
#include <cstdio> 
#include <cstdlib> 
//extern "C" int shared_int;//i've tried both 
extern int shared_int; 
int printVal(); 
#endif 

//shared.cpp 
#include <cstdio> 
#include "shared.h" 

int printVal(){ 
    fprintf(stderr,"a: %d\n",shared_int); 
    return 0; 
} 

//main.cpp 
#include <cstdio> 
#include "shared.h" 

int main(){ 
    int shared_int = 5; 
    printVal(); 
    return 0; 
} 

यह मैं कैसे संकलन

g++ main.cpp shared.o 
shared.o: In function `printVal()': 
shared.cpp:(.text+0x6): undefined reference to `shared_int' 
collect2: ld returned 1 exit status 
+1

जवाब पहले से ही ग्रेग द्वारा दिया जाता है, लेकिन एक घोषणा और एक परिभाषा के बीच अंतर को समझने के लिए सुनिश्चित करें। यह एक महत्वपूर्ण भेद है जो आपको संकलक के संदेशों को बेहतर ढंग से समझने में मदद करेगा, और कोड के समग्र अर्थपूर्ण। – Nick

+0

आपका अपडेट किया गया कोड 'बाहरी "सी" 'जोड़ता है (जो कि मैंने अपने उत्तर में जो कुछ भी सुझाया है उससे काफी अलग है), और परिभाषा को बिल्कुल प्रस्तुत नहीं करता है। इसके बजाय मैंने अपने उत्तर में जो सुझाव दिया है उसका प्रयास करें। –

+0

@ कुल हेविल। मैंने यह भी कोशिश की है, एक ही लिंकिंग त्रुटि।धन्यवाद – monkeyking

उत्तर

15

अपने हेडर फाइल में घोषणा एक extern की जरूरत है:

extern int shared_int; 

उसके बाद, आप एक सी ++ फाइल में परिभाषा का एक वास्तविक उदाहरण (जैसे की आवश्यकता होगी shared.cpp में):

int shared_int; 

गार्ड तुम यहाँ का उपयोग कर रहे शामिल अच्छा अभ्यास है, लेकिन वे इस स्थिति में कोई प्रभाव नहीं पड़ेगा। गार्ड में समान स्रोत फ़ाइल में हेडर फ़ाइल को एक से अधिक बार शामिल करने से रोकता है। ऐसी स्थिति आमतौर पर तब तक नहीं होती है जब तक आपके पास शीर्षलेख फ़ाइलों को अप्रत्यक्ष रूप से अन्य शीर्षलेख फ़ाइलों से शामिल नहीं किया जाता है।

+0

+1 ग्रेग। मैंने यह भी देखा कि @monkeyking सी हेडर फाइलों को मिला रहा है। सी ++ कंपाइलर के साथ। यह एक बहुत अच्छा अभ्यास नहीं है, इसलिए मैं केवल यह इंगित करूंगा कि यदि आप प्रतीक को उलझाने वाली समस्याओं से बचने के लिए प्रतीक को प्रतीक के रूप में निर्यात करने के लिए मजबूर करते हैं तो शायद बेहतर होगा। बस shared.h पर चर को परिभाषित करें: बाहरी "सी" int shared_int; – karlphillip

+3

@karlphillip: "सी हेडर फ़ाइल" जैसी कोई चीज़ नहीं है - हेडर फ़ाइलों को संकलित किया गया है जो भी कंपाइलर # उन्हें शामिल करता है। '.h' नाम सी ++ के लिए पूरी तरह से स्वीकार्य है। कुछ लोग '.hpp' या' .hxx' का उपयोग कर सकते हैं लेकिन यह सिर्फ शैली है और इसका कोई अर्थ नहीं है। –

0

सबसे पहले, ग्लोबल्स बिल्कुल अच्छे विचार नहीं हैं और किसी को यथासंभव से बचना चाहिए। यह मानते हुए कि आपकी विशेष स्थिति में, शुद्ध ओओ परिप्रेक्ष्य से, जो भी कारणों से अनिवार्य रूप से आवश्यक है, मैं निम्नलिखित तरीके से संपर्क करूंगा:

ए) एक फ़ाइल में वैश्विक चर परिभाषित करें a.cpp (अगर भी चर एक नाम स्थान में एम्बेड किया जा सकता है)

ख) लिखें a.cpp में/सेट कार्यों मिल

ग) प्राप्त/सेट कार्यों का उपयोग कर a.cpp में वैश्विक चर पर पहुँचें।

इस तरह, आपके पास अच्छी तरह से परिभाषित इंटरफेस के साथ एक बहुत ही मॉड्यूलर डिज़ाइन होगा।

-1

आप बहुत जल्द ही कर रहे हैं:

//shared.h 
#ifndef INCLUDE_GUARD_H 
#define INCLUDE_GUARD_H 
#include <cstdio> 
#include <cstdlib> 
//extern "C" int shared_int;//i've tried both 
extern int shared_int; 
int printVal(); 
#endif 

//shared.cpp 
#include <cstdio> 
#include "shared.h" 

int printVal(){ 
    fprintf(stderr,"a: %d\n",shared_int); 
    return 0; 
} 

//main.cpp 
#include <cstdio> 
#include "shared.h" 

int shared_int = 0; // definition (extern ... is declaration) 
        // initialize force definition 

int main(){ 
    shared_int = 5; 
    printVal(); 
    return 0; 

}

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