2013-10-10 4 views
7

क्षमा करें यदि यह दोहराया गया प्रश्न है, लेकिन मैं कुछ घंटों के लिए खोज कर रहा हूं, और मुझे विवादित उत्तर मिल रहे हैं ... और इससे भी बदतर, उनमें से कोई भी नहीं काम कर रहे हैं।ग्रहण/जीसीसी: बाहरी परिवर्तनीय के लिए अनिर्धारित संदर्भ

यह एक साधारण बात है। मेरे पास कई स्रोत फ़ाइलें हैं, और मेरे पास कुछ सामान्य पैरामीटर हैं जिन्हें मैं एक फ़ाइल में होना चाहता हूं, "पैरामीटर एच" कहें। मैं प्रोग्राम के तर्क के रूप में उन्हें पास करके, इन पैरामीटर (एक बार) रनटाइम पर सेट करना चाहता हूं।

पीएस: मुझे पता है कि ऐसा करने का एक बेहतर तरीका कार्यों के लिए तर्क के रूप में सबकुछ पास करना है, लेकिन यह कोड का एक छोटा टुकड़ा है और मुझे बहुत सारे बदलाव किए बिना जल्द ही परिणाम प्राप्त करने की आवश्यकता है।

यहाँ एक न्यूनतम काम कर उदाहरण है:

Parameters.h

#ifndef PARAMETERS_H_ 
#define PARAMETERS_H_ 

extern int Alpha; 

#endif 

main.cpp

#include <iostream> 
#include "Parameters.h" 

int main(int argc, char * argv[]) 
{ 
    const int Alpha = 12.0; 
} 

Functions.cpp

#include "Parameters.h" 

double Foo(const double& x) 
{ 
    return Alpha*x; 
} 

जब मैं

gcc main.cpp Functions.cpp 

साथ संकलन मैं त्रुटि "।:` अल्फा 'के लिए अपरिभाषित संदर्भ Functions.cpp :(पाठ + 0xA) "मिलता है।

उत्तर

17

आपने Alpha नामक एक वैश्विक चर घोषित किया है, लेकिन आपने इसे परिभाषित नहीं किया है। ठीक एक स्रोत फ़ाइल में, फ़ाइल दायरे में लिखें:

int Alpha; 

या एक प्रारंभकर्ता साथ:

int Alpha = 42; 

ध्यान दें कि स्थानीय चर नामित Alpha आप main भीतर परिभाषित किया है से अलग और पूरी तरह से इस से संबंधित नहीं है वैश्विक चर।

+0

आपको बहुत बहुत धन्यवाद! समस्या यह थी कि, जैसा कि आप कहते हैं, कि मैं मुख्य.cpp में फ़ाइल दायरे में अल्फा को परिभाषित नहीं कर रहा था। अब मैं बेवकूफ की तरह महसूस करता हूं :-) फिर से धन्यवाद। – MGA

+0

क्या अल्फा को हेडर फ़ाइल में घोषित करने पर अल्फा को 'बाहरी' के रूप में परिभाषित करने की आवश्यकता है? – ldgorman

+1

@ldgorman: यदि आप 'बाहरी' का उपयोग नहीं करते हैं, तो यह केवल एक घोषणा नहीं होगी, बल्कि एक घोषणा होगी। यदि आप इस हेडर को एक से अधिक स्रोत फ़ाइल में शामिल करते हैं, तो आपको एक ही प्रतीक की कई परिभाषाओं के बारे में लिंकर त्रुटियां मिलेंगी। –

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