2010-01-31 14 views
11

मैं विजुअल स्टूडियो 2010 में सी लिख रहा हूं। कंपाइलर मुझे इनलाइन वैरिएबल घोषणाओं का उपयोग नहीं करना चाहता है। निम्नलिखित कोड एक त्रुटि पैदा करता है:माइक्रोसॉफ्ट सी कंपाइलर: इनलाइन परिवर्तनीय घोषणा?

unsigned int fibonacci_iterative(unsigned int n) { 
if (n == 0) { 
    return 0; 
} 
if (n == 1) { 
    return 1; 
} 

unsigned int prev_prev = 0; // error 
unsigned int prev = 1; // error 
unsigned int next = 0; // error 
for (int term_number = 0; term_number < n; term_number++) { 
    unsigned int temp = prev_prev + prev; 
    prev = next; 
    prev_prev = prev; 
    next = temp; 
} 

return next; 
} 

त्रुटि:

error C2143: syntax error : missing ';' before 'type'

error C2143: syntax error : missing ';' before 'type'

error C2143: syntax error : missing ';' before 'type'

हो रहा क्यों है? क्या संकलक को इतना सख्त बनाने की कोई सेटिंग नहीं है?

उत्तर

10

सी 8 9 में गैर-घोषणाओं के बाद घोषणाओं को रखने की अनुमति नहीं है, हालांकि इसे सी ++ में और सी 99 में अनुमति दी गई है (हालांकि एमएसवीसी अभी भी सी 99 का समर्थन नहीं करता है)।

C89 में, आप एक नेस्टेड ब्लॉक का उपयोग करके एक समान प्रभाव को प्राप्त कर सकते हैं:

unsigned int fibonacci_iterative(unsigned int n) { 
    if (...) { 
    } 

    { 
     unsigned int prev_prev = 0; 
     unsigned int prev = 1; 
     unsigned int next = 0; 
     ... 
    } 
} 
+2

हालांकि थोड़ा गन्दा है, है ना? उन सभी फ़ंक्शन जो उन चरों को संदर्भित करते हैं उन्हें ब्लॉक के अंदर होना होगा ताकि वेरिएबल गुंजाइश से बाहर न जाएं। अगर अधिक उपयोग किया जाता है, तो यह _very_ गन्दा और ब्रेस-भारी कोड का कारण बन जाएगा। –

+0

@Chinmay: यह निर्भर करता है। हाँ, यह बड़े ब्लॉक के लिए गन्दा हो सकता है, लेकिन यह छोटे ब्लॉक के लिए भी उपयोगी हो सकता है जहां कुछ चरों को केवल एक सीमित सीमित क्षेत्र की आवश्यकता होती है। – jamesdlin

+0

वह पोर्टेबल कितना है? ऐसा लगता है कि यह परेशानी के लिए पूछ रहा है। –

1

इसे C++ के रूप में संकलित करने का प्रयास करें। सी 99 स्कोप के शीर्ष के अलावा चर को घोषित करने की अनुमति देगा, लेकिन वीसी को सी 99 के बारे में पता नहीं है।

+0

चिन्मय उल्लेख के रूप में, C और C++ स्रोत स्तर पर पूरी तरह से संगत नहीं हैं। http://en.wikipedia.org/wiki/Compatibility_of_C_and_C++ – ephemient

1

इनलाइन परिवर्तनीय घोषणाएं केवल सी 99 अनुपालन कंपाइलर में समर्थित हैं। माइक्रोसॉफ्ट विजुअल सी ++ सी 99-अनुरूप नहीं है (ref)। आपको या तो एक C99-compliant संकलक का उपयोग करना होगा (-std=c99 के साथ उपयोग किए जाने पर जीसीसी इनलाइन चर के साथ कोड संकलित करेगा) या फ़ंक्शन के शीर्ष पर अपने चर घोषित करें।

संपादित करें: या एसीलियो द्वारा सुझाए गए सी ++ मोड को आजमाएं, हालांकि सी और सी ++ एक दूसरे के साथ सख्ती से संगत नहीं हैं, इसलिए यदि (उदाहरण के लिए), तो आप अपने सी कोड में किसी भी सी ++ - विशिष्ट कीवर्ड का उपयोग करते हैं, यह जीता संकलित नहीं है।

+1

कीवर्ड अलग-अलग, पॉइंटर कास्टिंग और 'एनम/स्ट्रक्चर/यूनियन' नामस्थान के बारे में अलग-अलग नियम भी सी ++ मोड में संकलित करने के लिए सुरक्षित सी कोड विफल कर सकते हैं। सी ++ में 'sizeof (' a ') == sizeof (int)' की तरह अन्य tidbits हैं, लेकिन 'sizeof (' a ') == sizeof (char) 'C++ में, लेकिन व्यवहार में यह समस्या का एक आम कारण नहीं है। – ephemient

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