2010-01-11 13 views
56

क्या संरचना-टाइप किए गए चर के उदाहरण को अस्थिर के रूप में घोषित करने के लिए पर्याप्त है (यदि इसके फ़ील्ड पुनः प्रवेश कोड में पहुंचे हैं), या किसी को ढांचे के विशिष्ट फ़ील्ड को अस्थिर के रूप में घोषित करना चाहिए?अस्थिर संरचना सेमेटिक्स

अलग ढंग से phrased, अर्थ मतभेद (यदि हो तो) के बीच है क्या: मैं पहचान

typdef struct { 
    uint8_t bar; 
} foo_t; 

volatile foo_t foo_inst; 

और

typedef struct{ 
    volatile uint8_t bar; 
} foo_t; 

foo_t foo_inst; 

कि अस्थिर रूप में एक सूचक टाइप चर घोषित करने (जैसे अस्थिर uint8_t * foo) केवल संकलक को सूचित करता है कि foo द्वारा इंगित किए गए पते के बारे में कोई बयान नहीं देते हुए foo द्वारा संबोधित पता बदल सकता है। यह स्पष्ट नहीं है कि संरचना-टाइप किए गए चर के लिए एक समानता है या नहीं।

उत्तर

61

आपके उदाहरण में, दोनों समान हैं। लेकिन मुद्दे पॉइंटर्स के चारों ओर घूमते हैं।

सबसे पहले, volatile uint8_t *foo; संकलक को बताता है कि स्मृति को इंगित किया जा रहा है अस्थिर है। यदि आप पॉइंटर को अस्थिर के रूप में चिह्नित करना चाहते हैं, तो आपको uint8_t * volatile foo;

और यह वह जगह है जहां आप संरचना को चिह्नित करने के बीच मुख्य अंतर को अलग-अलग क्षेत्रों को चिह्नित करने के रूप में अस्थिर बनाते हैं। यदि आप था:

typedef struct 
{ 
    uint8_t *field; 
} foo; 

volatile foo f; 

कि की तरह काम करते हैं:

typedef struct 
{ 
    uint8_t * volatile field; 
} foo; 

और नहीं चाहते:

typedef struct 
{ 
    volatile uint8_t *field; 
} foo; 
+1

यदि फ़ील्ड 'uint8_t फ़ील्ड [10]' था, तो जब आप संरचना को अस्थिर के रूप में चिह्नित करते हैं तो अंतर्निहित डेटा अस्थिर या "effec के रूप में चिह्नित होता है टिव "क्षेत्र में पॉइंटर अस्थिर चिह्नित? –

+1

अंतर्निहित डेटा अस्थिर है। इसके बारे में सोचने की एक बात यह है कि 'प्रभावी' सूचक संशोधित नहीं है (यह हमेशा पहले तत्व का पता है) इसलिए इसके अस्थिरता का कोई अर्थ नहीं होगा। एक साइडबार पर –

13

अगर आप अस्थिर के साथ एक संरचना की घोषणा तो अपने सभी सदस्यों को भी अस्थिर हो जाएगा

+0

यह भी कॉन्स के लिए सच है – Alon

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