2012-12-09 6 views
6
#include <stdio.h> 

int i=10; 
int j=i; 
int main() 
{ 
    printf("%d",j); 
} 

मुझे एक त्रुटि मिलती है जिसमें प्रारंभिक तत्व निरंतर नहीं है? इसके पीछे का कारण क्या है?एक गैर निरंतर प्रारंभकर्ता का उपयोग कर वैश्विक चर की परिभाषा

+0

'मैं' घ एक चर, नहीं एक निरंतर है। और सी वैश्विक या स्थैतिक चर के लिए गैर-निरंतर प्रारंभकर्ताओं की अनुमति नहीं देता है। सी इस संबंध में सी ++ से अलग है। –

+0

@ATaylor नोप। कॉन्स int इसे हल नहीं करता है। –

+1

@ user963472: सी में (सी ++ के विपरीत) 'const' घोषणाएं लगातार अभिव्यक्तियां उत्पन्न नहीं करती हैं। –

उत्तर

12

इसके पीछे क्या कारण है?

सी (सी ++ के विपरीत) गैर मूल्यों के साथ वैश्विक मूल्यों के प्रारंभिकरण की अनुमति नहीं देता है।

C99 मानक: धारा 6.7.8:

सभी एक वस्तु स्थिर भंडारण अवधि निरंतर भाव या स्ट्रिंग शाब्दिक होगा है के लिए एक प्रारंभकर्ता में भाव।

+0

पर विचार करें मैंने इंटरनेट में देखा कि स्थिर भंडारण वाले चर भार लोड समय पर आवंटित किए जाते हैं। क्या यह मेरे उपरोक्त प्रश्न के साथ कुछ करने के लिए मिला है। –

+0

@ user963472: मुझे आपका प्रश्न समझ में नहीं आया। क्या आप विस्तार से बता सकते हैं? –

2

आप का उपयोग कर की कोशिश कर सकते:

int i=10; 
int j=0; 

int main() 
{ 
    j=i;//This should be the first statement in the main() and you achieve the same functionality as ur code 
    return 0; 
} 

ही सच्चा सी रास्ता कार्यावधि में यह प्रारंभ करने में है। हालांकि सी ++ में आपका कोड ठीक काम करेगा, बिना किसी संकलन त्रुटियों के।

सी मानक स्पष्ट रूप से गैर-स्थिर मूल्यों के साथ वैश्विक वस्तुओं के प्रारंभिकरण को प्रतिबंधित करता है। C99 मानक के Section 6.7.8 का कहना है:

सभी एक वस्तु स्थिर भंडारण अवधि निरंतर भाव या स्ट्रिंग शाब्दिक होगा है के लिए एक प्रारंभकर्ता में भाव।

एक वस्तु जिसका पहचानकर्ता बाहरी या आंतरिक लिंकेज, या भंडारण-वर्ग विनिर्देशक स्थिर साथ साथ घोषित किया जाता है स्थिर भंडारण है:

static storage duration के साथ एक वस्तु की परिभाषा खंड 6.2.4 में है अवधि। इसका जीवनकाल कार्यक्रम का पूरा निष्पादन है और इसके संग्रहीत मूल्य प्रोग्राम स्टार्टअप से पहले केवल एक बार शुरू किया गया है।

1

इस आवश्यकता के पीछे विचार सभी स्थिर भंडारण अवधि ऑब्जेक्ट संकलन समय पर शुरू किया जाना है। कंपाइलर सभी स्थैतिक डेटा को पूर्व-प्रारंभिक रूप में तैयार करता है ताकि इसे रन टाइम पर कोई अतिरिक्त प्रारंभिक कोड की आवश्यकता न हो। अर्थात। जब संकलित प्रोग्राम लोड होता है, तो ऐसे सभी चर पहले से ही प्रारंभिक स्थिति में अपना जीवन शुरू करते हैं।

सी भाषा (सी 8 9/9 0) के पहले मानकीकृत संस्करण में यह आवश्यकता कुल प्रारंभिकताओं पर भी लागू होती है, भले ही वे स्थानीय चर के साथ उपयोग किए जाते थे।

void foo(void) 
{ 
    int a = 5; 
    struct S { int x, y; } s = { a, a }; /* ERROR: initializer not constant */ 
} 

जाहिर है कि प्रतिबंध के लिए कारण यह है कि कुल initializers सिर्फ वैश्विक चर की तरह, पूर्व प्रारंभ डेटा सेगमेंट में पहले से निर्मित किया जाना था था।

0

उपयोग इस: -

int i=10,j=1; 
int main() 
{ 
    printf("%d",j); 
} 

हालांकि यह एक छोटा सा परिवर्तन है, लेकिन यह काम करेंगे

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