2012-08-08 21 views
5

मुझे निम्नलिखित कोडों के साथ विशेष रूप से header.c में कुछ समस्या मिली है, जहां मैं header.h में बाहरी int x चर का उपयोग नहीं कर सकता ... क्यों? क्या बाहरी चर .h वैश्विक नहीं है? मैं इसे अन्य फ़ाइलों पर कैसे उपयोग कर सकता हूं?सी अपरिभाषित संदर्भ

=== header.h ===

#ifndef HDR_H 
#define HDR_H 

extern int x; 
void function(); 

#endif 

=== header.c ===

#include <stdio.h> 
#include "header.h" 

void function() 
{ 
    printf("%d", x); //****undefined reference to x, why?**** 
} 

=== sample.c ===

int main() 
{ 
    int x = 1; 
    function(); 
    printf("\n%d", x); 
    return 0; 
} 
+1

संभवतः केवल अपने मुख्य कार्य में 'x' से पहले 'int' को हटा दें। यह वैश्विक चर – bph

+0

(हटाए गए; गलती से टिप्पणी की गई) के रूप में उसी नाम के साथ मुख्य फ़ंक्शन में बनाए गए एक नए स्थानीय चर को रोक देगा। –

+0

[http: // stackoverflow में बाहरी int के बारे में और अधिक जानकारी देखें।com/प्रश्न/7610321/अंतर-बीच-निर्वासन-पूर्णांक-ए-निर्वासन-पूर्णांक एक 42] [1] [1]: http://stackoverflow.com/questions/7610321/difference -बेटवीन-बाहरी-int-a-extern-int-a-42 –

उत्तर

1

extern एक चर घोषित करता है, लेकिन इसे परिभाषित नहीं करता है। यह मूल रूप से संकलक को बताता है कि कहीं और x की परिभाषा है।

int x; 

ध्यान दें कि main() में स्थानीय चर x वैश्विक चर x छुपा देगा: जोड़ने header.c (या कुछ अन्य .c फ़ाइल लेकिन केवल एक .c फ़ाइल) के लिए निम्न ठीक करने के लिए।

1

वास्तव में extern int x; का अर्थ है x किसी अन्य स्थान/अनुवाद इकाई में परिभाषित किया जाएगा।

कंपाइलर को कहीं भी वैश्विक दायरे में x की परिभाषा खोजने की उम्मीद है।

3

extern कीवर्ड कहता है कि चर मौजूद है लेकिन इसे नहीं बनाता है। संकलक उम्मीद करता है कि एक और मॉड्यूल के उस नाम के साथ एक वैश्विक चर होगा, और लिंकर उनसे जुड़ने के लिए सही काम करेगा।

/* x is a global exported from sample.c */ 
int x = 1; 

int main() 
{ 
    function(); 
    printf("\n%d", x); 
    return 0; 
} 
7

घोषणा

extern int x; 

संकलक है कि कुछ स्रोत फ़ाइल में वहाँ एक वैश्विकx नामित चर हो जाएगा बताता है:

आप sample.c इस तरह बदलने की जरूरत है। हालांकि, main फ़ंक्शन में आप स्थानीय परिवर्तनीय x घोषित करते हैं। इसे वैश्विक बनाने के लिए main के बाहर घोषणा को ले जाएं।

0

मैं पुनर्निर्माण होगा/इस तरह अपने कोड को संशोधित करने और header.c

=== sample.h ===

#ifndef SAMPLE_H 
#define SAMPLE_H 

extern int x; 
void function(); 

#endif 

=== sample.c से छुटकारा पाने के ===

#include <stdio.h> 
#include "sample.h" 

int x; 

void function() 
{ 
    printf("%d", x); 
} 

int main() 
{ 
    x = 1; 
    function(); 
    printf("\n%d", x); 
    return 0; 
} 
+0

समझ गया! सबको धन्यवाद! – Analyn