संरचना घोषणा के अंत में इस [1] का उद्देश्य क्या है?


96

मैं अपने MSP430 माइक्रोकंट्रोलर की हेडर फ़ाइलों के माध्यम से स्नूपिंग कर रहा था, और मैं इसमें भाग गया <setjmp.h>:

/* 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 */

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


5
शायद सूचक में क्षय के साथ कुछ करना है?
इलाजरत

3
अंतिम टिप्पणी बिलकुल गलत लगती है ...
R .. GitHub STOP HELPING ICE

जवाबों:


115

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

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


12
यह भी के माध्यम से नकल को रोकता है =
मेलपोमेन

11
कि सकल है। एक बार जब मेरा समय बीत जाएगा तो मैं इस उत्तर को स्वीकार करूँगा। आपकी सहायताके लिए धन्यवाद!
अलेक्जेंडर -

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

4
@ShadowRanger यह एक चतुर चाल है, लेकिन ... otherwise lacks itइसके बारे में सकल क्या है। सी की सीमाएं, स्वयं वर्कअराउंड नहीं
अलेक्जेंडर - मोनिका

34
IMO यह सकल है। पहली बार GMP के साथ काम करते हुए मैं समझ नहीं पाया कि यह कैसे काम करता है क्योंकि संख्याएं स्पष्ट रूप से मूल्य से पारित हो गई थीं। मुझे इसे बाहर निकालने के लिए GMP हेडर में खुदाई करनी थी। यह सिर्फ उन लोगों के चेहरे पर उड़ता है जो वास्तव में सी को पहले से जानते हैं। फिर आपको मानसिक ट्रैक रखना होगा कि कौन से पैरामीटर मान द्वारा पारित किए गए हैं और जो *कोड में सिर्फ तलाश करने के बजाय संदर्भ हैं ।
एमएम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.