2011-11-14 11 views
5
#include<stdio.h> 
int x=13; // forcing space allocation 
int x; 
int main(){ 
    printf("%d\n",x); 
} 

उपरोक्त कोड संकलित करता है लेकिन नीचे वाला कोई नहीं है। क्यूं कर ?त्रुटि: कोई लिंकेज के साथ पुनर्वितरण

#include<stdio.h> 
int main(){ 
    int x=13; // forcing space allocation 
    int x; 
    printf("%d\n",x); 
} 

मुझे बताया गया था कि int x; संदर्भ के आधार पर एक घोषणा या परिभाषा के रूप में शिकायतकर्ता द्वारा व्याख्या की जा सकती है। मैं देख सकता हूं कि पहले मामले में (वैश्विक एक) लेकिन दूसरे में क्या होता है।

उत्तर

4

Quoting:

आप सी कार्यक्रम में ही नाम के दो वैश्विक चर नहीं हो सकता। सी tentative definition rule के माध्यम से एक ही फ़ाइल स्कोप में एकाधिक परिभाषाओं की अनुमति दे सकता है, लेकिन किसी भी मामले में सभी परिभाषाएं को उसी चर में संदर्भित करेंगी।

+0

मैं जो कहता हूं उससे सहमत हूं। लेकिन स्थानीय चर के लिए एक ही बात क्यों लागू नहीं होती है। मुझे बात है कि मैं कुछ बहुत याद कर रहा हूँ। कृपया सही दिशा में इंगित करें – Bazooka

+0

आप केवल उन चर के लिए टेंगेटिव परिभाषा प्राप्त कर सकते हैं जिनमें फ़ाइल स्कोप है, न कि स्थानीय चर के लिए। –

0

क्योंकि आप एक ही नाम के साथ स्थानीय चर दो बार घोषित नहीं कर सकते हैं। बस ऐसा मत करो।

यह वैश्विक के लिए काम करता है, क्योंकि संकलक forward declaration के रूप में देखते हैं, जो निश्चित रूप से स्टैक चर के साथ काम नहीं कर सकता है।

ध्यान दें कि यह केवल वैश्विक स्तर पर काम कर सकता है जब कोई मान असाइन नहीं किया जाता है।

+1

यह वैश्विक चर के लिए काम करता है। स्वचालित प्रकार के लिए क्यों नहीं? – Bazooka

+0

आप स्वचालित प्रकार को क्या कहते हैं? – Macmade

+0

संपादन देखें ... – Macmade

0

अपनी टिप्पणी से पर जारी: "आप आगे घोषणाओं पर विस्तृत कृपया कर सकते हैं" ...

आगे घोषणाओं वे वास्तव में क्या की तरह ध्वनि कर रहे हैं। एक घोषणा जो कहीं और (बाद में) परिभाषित की जाएगी। यह अवधारणा केवल वैश्विक प्रतीकों पर लागू होती है। परिणामस्वरूप बाइनरी के भीतर केवल वैश्विक प्रतीक की एक परिभाषा हो सकती है। हालांकि, आप उन्हें स्रोत कोड के भीतर बार-बार घोषित कर सकते हैं ताकि उन्हें संकलन चरण के दौरान संदर्भित किया जा सके।

ये प्रतीक असेंबली में परिभाषा बन जाते हैं जिन्हें बाद में लिंकिंग चरण के दौरान सबकुछ जोड़ने के लिए उपयोग किया जाता है।

शीर्षलेख फ़ाइलें कोड में कहीं और (बाद में) परिभाषित आगे की घोषणाओं का एक आम उपयोग उदाहरण हैं।

स्थानीय (स्वचालित) चर प्रतीकों में परिवर्तित नहीं होते हैं। तो जब आप

int x; 
int x; 

उसी दायरे में कुछ कहते हैं तो संकलक इसे अस्वीकार करता है क्योंकि यह गैरकानूनी है। स्थानीय चर केवल फ़ंक्शन के स्टैक फ्रेम के भीतर किसी विशेष स्थान को इंगित करने की सुविधा प्रदान करते हैं। उनकी परिभाषा सीमा स्कोप मार्कर {} के भीतर है।

शीर्षलेख फ़ाइलें वैश्विक चर और कार्यों के अनिवार्य रूप से "आगे की घोषणाएं" हैं; इसे struct foo; में अपने लिए देखने के लिए।

यदि आप वैश्विक परिभाषा कारण त्रुटियों को देखना चाहते हैं तो प्रयास करें। int x = 10;int x = 11; एक वैश्विक के रूप में, और आप देखेंगे कि कंपाइलर "x का पुनर्वितरण" प्रभाव में त्रुटि उत्पन्न करता है।

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