2017-11-02 20 views
86

मैं अपने MSP430 माइक्रोकंट्रोलर के हेडर फाइल के माध्यम से ताक-झांक रहा था, और मैं <setjmp.h> में इस में भाग:संरचना घोषणा के अंत में इस [1] का उद्देश्य क्या है?

/* r3 does not have to be saved */ 
typedef struct 
{ 
    uint32_t __j_pc; /* return address */ 
    uint32_t __j_sp; /* r1 stack pointer */ 
    uint32_t __j_sr; /* r2 status register */ 
    uint32_t __j_r4; 
    uint32_t __j_r5; 
    uint32_t __j_r6; 
    uint32_t __j_r7; 
    uint32_t __j_r8; 
    uint32_t __j_r9; 
    uint32_t __j_r10; 
    uint32_t __j_r11; 
} jmp_buf[1]; /* size = 20 bytes */ 

मैं समझता हूँ कि यह एक गुमनाम struct वाणी और typedef jmp_buf के लिए यह है, लेकिन मैं समझ नहीं क्या [1] के लिए है। मुझे पता है कि यह एक सदस्य (इस अज्ञात संरचना के) के साथ एक सरणी होने के लिए jmp_buf घोषित करता है, लेकिन मैं कल्पना नहीं कर सकता कि इसका क्या उपयोग किया जाता है। कोई विचार?

+5

शायद पॉइंटर में क्षय करने के साथ कुछ करना है? – Elazar

+3

अंतिम टिप्पणी पूरी तरह से गलत लगता है ... –

+0

उत्कृष्ट सवाल! – SRG

उत्तर

103

सी में "संदर्भ प्रकार" बनाने के लिए यह एक आम चाल है, जहां इसे फ़ंक्शन तर्क के रूप में उपयोग करने से एकल तत्व सरणी को अपने पहले तत्व में पॉइंटर में अपग्रेड करने का कारण बनता है, बिना प्रोग्रामर को & ऑपरेटर का स्पष्ट रूप से उपयोग करने की आवश्यकता होती है अपना पता प्राप्त करने के लिए। जहां घोषित किया गया है, यह एक असली स्टैक प्रकार है (कोई गतिशील आवंटन आवश्यक नहीं है), लेकिन जब एक तर्क के रूप में पारित किया जाता है, तो बुलाया गया फ़ंक्शन एक पॉइंटर प्राप्त करता है, प्रतिलिपि नहीं, इसलिए यह सस्ता रूप से पारित हो जाता है (और यदि कॉल नहीं किया जाता है तो इसे बुलाया जा सकता है const)।

जीएमपी अपने mpz_t प्रकार के साथ एक ही चाल का उपयोग करता है, और यह वहां महत्वपूर्ण है, क्योंकि संरचना गतिशील आवंटित स्मृति के लिए एक सूचक का प्रबंधन करती है; mpz_init फ़ंक्शन संरचना में पॉइंटर प्राप्त करने पर निर्भर करता है, इसकी प्रति नहीं, या यह इसे प्रारंभ नहीं कर सका। इसी प्रकार, कई संचालन गतिशील रूप से आवंटित स्मृति का आकार बदल सकते हैं, और अगर वे कॉलर की संरचना को म्यूटेट नहीं कर पा रहे हैं तो यह काम नहीं करेगा।

+12

यह '=' के माध्यम से प्रतिलिपि रोकता है। – melpomene

+11

यह सकल है। एक बार न्यूनतम समय समाप्त हो जाने पर मैं इस जवाब को स्वीकार करूंगा। आपकी सहायताके लिए धन्यवाद! – Alexander

+2

@ एलेक्सेंडर: इस तरह 'टाइपपीफ' के माध्यम से encapsulated जब यह काफी सकल नहीं है। हाँ, यह विज्ञापन करना बहुत भयानक होगा, लेकिन यदि आपके पास बेहोश अपारदर्शी प्रकार है, जहां एपीआई उपयोगकर्ता को संदर्भ बनाम गैर-संदर्भ अर्थशास्त्र (इसे हमेशा * संदर्भ द्वारा पास किया जाना चाहिए) के बारे में सोचना चाहिए, तो यह एक है स्वचालित संदर्भ अर्थशास्त्र को उस भाषा में जोड़ने का उचित तरीका जिसमें अन्यथा इसका अभाव है। यह तब भी काम करता है जब उपयोगकर्ता अपना स्वयं का एपीआई लिखता है जो कि प्रकार प्राप्त करता है, क्योंकि सी में, आप एक सरणी को एक तर्क के रूप में स्वीकार करते हैं, जिसका अर्थ है कि आप एक सूचक स्वीकार करते हैं; सब कुछ "बस काम करता है"। – ShadowRanger

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