2009-01-19 12 views
10

संकलक मुझे प्रदान किए गए कोड पर निम्न त्रुटि संदेश क्यों देता है: "प्रारंभकर्ता तत्व निरंतर नहीं है"। इसी सी/सी ++ कोड पूरी तरह से जीसीसी के तहत संकलित करता है।उद्देश्य-सी त्रुटि: प्रारंभकर्ता तत्व स्थिर नहीं है

#import <Foundation/Foundation.h> 

const float a = 1; 
const float b = a + a; // <- error here 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    // insert code here... 
    NSLog(@"Hello, World!"); 
    [pool drain]; 
    return 0; 
} 
+0

क्या तुम जानते हो कि ऑब्जेक्टिव-सी के साथ-साथ जीसीसी के तहत संकलित किया गया है? – hhafez

+0

आप सभी उद्देश्य-सी सामान को हटा सकते हैं और इसे सी के रूप में संकलित कर सकते हैं और आपको एक ही त्रुटि मिलती है। – Chuck

+2

लेकिन आप सभी उद्देश्य-सी सामान भी हटा सकते हैं, main.c फ़ाइल में सहेज सकते हैं और gcc main.c के साथ संकलित कर सकते हैं और यह अपेक्षा के अनुसार काम करेगा। (कम से कम यह मेरे लिए काम करता है) –

उत्तर

12

कि कोड केवल सही ढंग से संकलन करता है, तो const float बयान कहीं फ़ाइल गुंजाइश के अलावा अन्य में दिखाई देगा।

यह मानक का स्पष्ट रूप से हिस्सा है। यह महत्वपूर्ण है कि सभी फ़ाइल-स्कोप घोषित चर निरंतर अभिव्यक्तियों के साथ प्रारंभ किए जाते हैं, निरंतर चर शामिल अभिव्यक्तियों में नहीं।

आप किसी अन्य ऑब्जेक्ट के मूल्य के साथ फ्लोट 'बी' शुरू कर रहे हैं। किसी भी वस्तु के मूल्य, भले ही वह एक स्थिरांक योग्य है, सी में एक निरंतर अभिव्यक्ति नहीं है

+0

क्या आप समझा सकते हैं क्यों? धन्यवाद मुझे दिलचस्पी है – hhafez

+2

@hhafez - इस मामले में 'बी' किसी अन्य वस्तु के साथ प्रारंभ नहीं किया गया है, लेकिन एक और आदिम के साथ। हालांकि, दोनों को 'कॉन्स्ट' के रूप में घोषित किया जाता है, और 'बी' 'ए' के ​​मूल्य पर निर्भर करता है, जो मानक द्वारा अवैध है। –

+0

क्या आप भाग को समझा सकते हैं "यदि केवल कॉन्स्ट फ्लोट स्टेटमेंट फ़ाइल स्कोप के अलावा कहीं और दिखाई देते हैं तो" केवल तभी संकलित होगा "? इसका क्या मतलब है? – Olie

1

मैं यहाँ इसलिए मैं अपने उदाहरण की कोशिश नहीं कर सकते हैं मेरी मशीन पर Xcode नहीं है,

लेकिन तुम कोशिश कर सकते

#define A (1) 
#define B (A + A) 

const float a = A; 
const float b = B; 
+0

आपका दूसरा समाधान एक ही त्रुटि देगा ... आप इसे एक शाब्दिक बनाने के लिए सिर्फ एक चर नहीं डाल सकते हैं। –

+0

ने मेरा दूसरा समाधान हटा दिया (केवल पहले छोड़ा गया) – hhafez

+3

ध्यान रखें कि # परिभाषित अभिव्यक्ति "प्रीप्रोसेसर निर्देश" हैं, जिसका अर्थ यह है कि संकलक को उस पर एक दरार होने से पहले कोड में बदल दिया जाता है। यदि यह काम करता है, तो ऐसा इसलिए होता है क्योंकि आपको "कॉन्स फ्लोट ए = (1);" और "कॉन्स फ्लोट बी = ((1) + (1));" संकलन समय पर। सुंदर व्यर्थ कुल मिलाकर। –

4

@dreamlax सही है, तो आप एक स्थिरांक घोषणा जिसका प्रारंभ एक और (स्थिरांक) चर पर निर्भर करता है नहीं हो सकता। यदि आपको दूसरे पर निर्भर रहने की आवश्यकता है, तो मैं एक चर बनाने का सुझाव देता हूं जिसे आप स्थिर के रूप में देख सकते हैं और इसे केवल एक बार शुरू कर सकते हैं। इन अतः जानकारी के लिए प्रश्न देखें:

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