2012-03-26 18 views
6

मैं इस कोड था:मैं एक स्थिर वैरिएबल वैल्यू के साथ स्थिर वैरिएबल क्यों शुरू नहीं कर सकता?

int foo(void){ 
    return 1; 
} 

int main(void){ 
    static const int x = foo(); 

    //do stuff 
    return 0; 
} 

लेकिन मैं एक गैर स्थिरांक मान के साथ एक स्थिर चर आरंभ के बारे में त्रुटि मिला है। मैंने सोचा कि इसके पास कॉन्स विनिर्देशक के साथ कुछ करना था, लेकिन ऐसा नहीं हुआ। अब

int foo(void){ 
    return 1; 
} 

int main(void){ 
    static int x = 0; 
    if (x == 0) x = foo(); 

    //do stuff 
    return 0; 
} 

, क्यों संकलक बस जब तक यह प्रयोग किया जाता है static int x चर के प्रारंभ में देरी नहीं कर सकते हैं, और अधिक महत्वपूर्ण बात, क्यों यह सिर्फ में रख नहीं कर सकते हैं: मैं स्थिरांक कीवर्ड छोड़ने और यह कर समाप्त हो गया एक पठन-लिखने वाला अनुभाग, और केवल यह लागू करें कि यह संकलन समय में लिखा नहीं गया है? मैं अपने कोड में बेहतर अर्थशास्त्र के लिए const और static कीवर्ड का उपयोग करना चाहता हूं, लेकिन मुझे वास्तव में परवाह नहीं है कि संकलक इसे कैसे संभालता है, बस इसे काम करने दें।

क्या सी मानक की मेरी समझ गलत है? या मेरा संकलक चूस रहा है? यह एमएसवीसी 9.0 है।

+1

मुख्य अच्छे में स्थिर चर क्या है? – tchap

+0

'x' आपके उदाहरण के संदर्भ में स्थानीय चर की तरह दिखता है। आप यह स्थिर क्यों होना चाहते हैं? –

+0

@ वालक्कपडेडी: अक्सर इस तथ्य के कारण कि आपको उस कार्य के लिए प्रत्येक कॉल के लिए इसे पुन: प्रारंभ करने की आवश्यकता नहीं है। –

उत्तर

8

सी के लिए इसकी आवश्यकता है।

सी स्टैंडर्ड से:

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

ध्यान दें कि const क्वालीफायर का मतलब निरंतर नहीं बल्कि केवल पढ़ने के लिए है। एक const वस्तु सी

कारण एक स्थिर वस्तु एक गैर निरंतर मूल्य द्वारा आरंभ नहीं किया जा सकता है तथ्य यह है कि एक स्थिर वस्तु के प्रारंभ किया जाता है से संबंधित है में एक स्थिर नहीं है ("स्टार्टअप प्रोग्राम से पहले" सी 99, 6.2.4 एमपी 3)।

+0

कृपया, समझाएं कि एक कॉन्स्ट ऑब्जेक्ट और सी में स्थिरता के बीच क्या अंतर है। सी में निरंतर एक शाब्दिक मूल्य है? – Spidey

+0

सी में निरंतर अभिव्यक्ति की परिभाषा बेहद सीमित है। यह 6.6 कॉन्सटेंट एक्सप्रेशन में सी 99 में परिभाषित किया गया है (http://port70.net/~nsz/c/c99/n1256.html#6.6 पर एचटीएमएल संस्करण) –

+0

@ स्पीडी एक स्थिर रूप से एक स्केलर शाब्दिक है, सी 99, 6.4.4 देखें परिभाषा के लिए। एक स्थिर निरंतर अभिव्यक्ति है। एक 'कॉन्स' ऑब्जेक्ट न तो स्थिर है और न ही निरंतर अभिव्यक्ति है। – ouah

1

प्रारंभ करने के लिए मूल्य संकलन या लिंक समय पर निर्धारित किया जाना चाहिए। सी में रचनाकारों की अवधारणा नहीं है जो प्रोग्राम की शुरुआत में चल सकती हैं।

1

इस बाधा सी मानक के खंड 6.7.8/4 से आता है, तो यह सिर्फ अपने संकलक नहीं है:

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

इस का कारण यह है कि सी ++ मानक के विपरीत, सी sdoes निष्पादन वातावरण की आवश्यकता नहीं पूर्व रन प्रारंभ के लिए एक प्रवेश बिंदु प्रदान करने के लिए (जबकि निश्चित रूप से यह नहीं पर रोक लगाने के है, ढंग से और स्थिर प्रारंभ के समय (5.1 .2) अनिर्दिष्ट है)।

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