2009-03-29 14 views
11

यह प्रश्न सिम्बियन ओएस से संबंधित है, लेकिन मुझे लगता है कि सी/सी ++ अनुभवी भी मेरी मदद कर सकता है। मैं सिम्बियन ओएस के लिए एक ओपन सोर्स लाइब्रेरी संकलित कर रहा हूं। एक जीसीसीई कंपाइलर का उपयोग करना यह किसी भी त्रुटि के साथ संकलित करता है (कुछ tinkering :) के बाद)। मैं ARMV5 को संकलक बदल गया है और अब मैं उदाहरण के लिए स्थिर स्थिरांक structs की परिभाषा के साथ कई त्रुटियाँ हैं,:स्थिर स्थिर संरचनाओं को परिभाषित करना

typedef struct Foos{ 
    int a; 
    int b; 
} Foos; 

और प्रकार का एक स्थिरांक struct की निम्नलिखित परिभाषा Foos

: मैं एक struct है
static const Foos foo = { 
    .a = 1, 
    .b = 2, 
}; 

जीसीसीई को इस के साथ कोई समस्या नहीं है और एआरएमवी 5 ".a = 1, .b = 2," पर "अभिव्यक्ति की उम्मीद" त्रुटि है। इसके बारे में मैंने जो कहा है उससे मैं मानता हूं कि यह विधि सी में कानूनी होनी चाहिए लेकिन सी ++ में अवैध होना चाहिए, अगर ऐसा है तो सी ++ में कॉन्स स्ट्रक्चर घोषित करने की संभावनाएं क्या हैं? यदि ऐसा नहीं है तो किसी भी अन्य मदद की सराहना की जाएगी।

अग्रिम धन्यवाद :)

उत्तर

13
static const struct Foos foo = { 1, 2 }; 

दोनों जी ++ और जीसीसी के साथ संकलित करता है।

typedef struct Foos { 
    int a; 
    int b; 
    Foos(int a, int b) : a(a), b(b) {} 
}; 

जो तुम तो जैसे initalize होगा::

static const struct Foos foo(1, 2); 
+0

धन्यवाद! क्षेत्र के नामों को हटाकर काम किया। – dudico

4

डॉट शैली अंकन मैं एएनएसआई C99 में मान्य लगता है

आप बेशक, के रूप में OneByOne बताते हैं, एक निर्माता निर्धारित कर सकते हैं। यह एएनएसआई सी 8 9 मान्य नहीं है। लगभग सभी सी कंपाइलर्स ने सी 99 लागू नहीं किया है।

+1

जीसीसी किसी भी कमांड लाइन विकल्प के बिना डॉट स्टाइल नोटेशन का समर्थन करता है। क्या अन्य सी कंपाइलर्स हैं? : ओ –

+0

अफसोस की बात है, हाँ। एमएसवीसी, जिसने AFAIK को अपने सी समर्थन को जमे हुए हैं। –

5

यह कानूनी सी 99 है, लेकिन कानूनी C89 या C++ नहीं है। संभवतः आप इसे C++ के रूप में संकलित कर रहे हैं, इसलिए यदि आप मानक-अनुपालन को लागू करने के लिए कंपाइलर विकल्पों का उपयोग करते हैं, तो जीसीसीई इसे भी अस्वीकार कर देगा।

आप सी या सी ++ में foo = {1, 2}; कर सकते हैं। जाहिर है कि आप वहां मौजूद फ़ील्ड नामों का लाभ खो देते हैं: आपको ऑर्डर सही करने पर भरोसा करना है।

सी ++ में एक और अच्छा विकल्प आपकी संरचना के लिए एक कन्स्ट्रक्टर को परिभाषित करना है, और static const Foos foo(1,2); के साथ प्रारंभ करना है। यह संरचना को पीओडी होने से रोकता है, इसलिए, आप स्मृति में इसके प्रतिनिधित्व के बारे में समान मान्यताओं को नहीं बना सकते हैं।

5

सिर्फ एक नोट है कि writable static data सिम्बियन के कुछ संस्करणों पर डीएलएल में समर्थित नहीं है। यह आपके प्रभावों को प्रभावित नहीं कर सकता है क्योंकि आपके उदाहरण हैं या आप केवल सिम्बियन v8.1b या बाद में समर्थन कर रहे हैं।

मैंने सोचा कि मैं इसे इंगित करूंगा क्योंकि मैं एक बार उस जाल में गिर गया था। ऊपर के लिंक से

उद्धरण: सिम्बियन ओएस

सिम्बियन OS पर वैश्विक लिखने योग्य स्थिर डेटा के लिए

समर्थन वैश्विक लिखने योग्य सभी संस्करणों और हैंडसेट पर व्यय में स्थिर डेटा का समर्थन करता है।

ईकेए 2 कर्नेल (8 पर आधारित सिम्बियन ओएस के संस्करण।1 बी और बाद में) लक्ष्य हार्डवेयर पर डीएलएल में डब्ल्यूएसडी का समर्थन करें। संस्करण 8.1a और इससे पहले, ईकेए 1 कर्नेल के आधार पर, डीएलएल में वैश्विक डब्ल्यूएसडी का समर्थन नहीं करते हैं।

+0

हाँ, मैं पूर्व 8.1 ओएस में स्थिर डेटा की सीमा से अवगत हूं, मैं 9.1 और बाद के लिए पुस्तकालय का उपयोग कर रहा हूं। वैसे भी उस महत्वपूर्ण नोट को बनाने के लिए धन्यवाद! – dudico

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