2014-10-19 10 views
8

मैं अपने प्रोजेक्ट में एक हेडर फाइल का उपयोग कर रहा था कि निम्नलिखित को परिभाषित (ओं):क्या सी में कुछ "अस्थिर स्थिरांक" घोषित करने का कोई कारण है लेकिन सी ++ में केवल "अस्थिर" है?

#ifdef __cplusplus 
    extern "C" { 
#endif 

#ifdef __cplusplus 
    #define __I  volatile    /*!< Defines 'read only' permissions*/ 
#else 
    #define __I  volatile const  /*!< Defines 'read only' permissions*/ 
#endif 

__I एक और हेडर फाइल में इस प्रकार प्रयोग किया जाता है:

typedef struct { 
    // more members before   
     __I uint32_t CR; /*!< GPIO Commit*/ 
    // more members after 

    } GPIOA_Type; 

#define GPIOF_BASE      0x40025000UL 
#define GPIOF       ((GPIOA_Type *) GPIOF_BASE) 

मेरा प्रश्न क्यों है होगा __I सी में बनाया गया है लेकिन सी ++ में नहीं? तुम अब भी मूल्य सीआर जब से तुम पता है की ओर इशारा करते है, संशोधित करने, लेकिन हूँ बस curios क्यों __I की परिभाषा अलग है सकते हैं।

दिलचस्पी लेने वाले किसी क्या इस के लिए या से है के लिए, __I परिभाषित करता है कॉर्टेक्स- एम 4 के लिए IAR एंबेडेड Workbench एआरएम से हैं, और struct टेक्सास इंस्ट्रूमेंट्स LM4F120H5QR CMSIS फाइलों से है।

+1

सी ++ में 'const' आंतरिक लिंकेज प्रदान करता है। मुझे नहीं पता कि यह सी में करता है, लेकिन मुझे संदेह नहीं है। वैसे भी, ध्यान दें कि '__I' एक नाम है जो कार्यान्वयन के लिए आरक्षित है, और इसका उपयोग उपयोगकर्ता कोड में नहीं किया जाना चाहिए। –

+0

@Mat McNabb मैं मतलब के बाद से मैं सीआर सही पता मैं निम्नलिखित #define GPIO_PORTF_CR_R (* ((वाष्पशील अहस्ताक्षरित लंबे *) 0x40025524)) कर सकते हैं रजिस्टर कि, तो GPIO_PORTF_CR_R = xxxxx, और कहा कि रजिस्टर के मूल्य में परिवर्तन करना । – SoftwareDev

+0

@SoftwareDev ठीक है - 'अस्थिर स्थिरांक CR' मतलब है कि आप रजिस्टर संशोधित करने के लिए' CR' का उपयोग नहीं कर सकते हैं; निश्चित रूप से यह –

उत्तर

7

सी ++ में, const स्थिरता के लिए फ़ाइल स्कोप डिफ़ॉल्ट पर चर, जो स्मृति-मैप किए गए जीपीआईओ के लिए वांछित नहीं होगा। उस के लिए "सही" ठीक extern कीवर्ड है, लेकिन यह यहाँ नहीं किया जा सकता, क्योंकि जाहिर __I जरूरतों के साथ-साथ वर्ग के सदस्यों के साथ काम करने के लिए। तो const को हटाकर वांछित के रूप में डिफ़ॉल्ट लिंक extern बनाता है।

+0

यदि ऐसा कारण है, तो मैं यह भी ध्यान दूंगा कि जो भी मूल कोड लिखा है, उसे ग्लोबल्स –

+0

@MattMcNabb के मुकाबले सदस्य चर के लिए एक अलग संस्करण होना चाहिए "हिमसाइट हमेशा 20-20 है।" ग्लोबल्स और सदस्यों दोनों के लिए सी कोड में मैक्रो का उपयोग करने के बाद सी ++ समर्थन शायद लंबे समय तक जोड़ा गया था। –

+0

@ बेनवोइग समझ में आता है। तो मूल रूप से, इस कोड को लिखने वाले व्यक्ति ने कहा, "सीआर + में केवल सीआर पढ़ने के लिए कोई रास्ता नहीं है, भले ही हम यही चाहते हैं"? हालांकि उस व्यक्ति के प्रति अधिक झुकाव है जिसने सी कोड लिखा है, डेटाशीट को सही ढंग से नहीं पढ़ रहा है क्योंकि इसके अनुसार सीआर रजिस्टर का मूल्य डिफ़ॉल्ट से बदला जा सकता है, असल में अगर इसे बदला नहीं जा सकता है तो पुल-अप को सक्षम करने का कोई तरीका नहीं है विकास बोर्ड में स्विच में से एक में प्रतिरोधी का उपयोग कर रहा हूँ। – SoftwareDev

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