2011-08-24 12 views
5

मैं ऑफसेट() को पैरामीटर लाइन mystruct1 में चाहता हूं। मैंआप संरचना पर ऑफसेट() का उपयोग कैसे करते हैं?

offsetof(struct mystruct1, rec.structPtr1.u_line.line) 

और भी

offsetof(struct mystruct1, line) 

लेकिन न तो काम करता है की कोशिश की है।

union { 
    struct mystruct1 structPtr1; 
    struct mystruct2 structPtr2; 
} rec; 

typedef struct mystruct1 { 
    union { 
     struct { 
      short len; 
      char buf[2]; 
     } line; 

     struct { 
      short len; 
     } logo; 

    } u_line; 
}; 
+0

क्या आप हमें संरचना परिभाषाओं के लिए संकलित कोड प्रदान नहीं कर सकते?या 'संरचना mystruct2' को छोड़ दें ... –

+0

"न तो काम करता है" से आपका क्या मतलब है? –

उत्तर

7

offsetof() मैक्रो दो तर्क लेता है की की भरपाई देख सकते हैं। C99 मानक कहते हैं (§7.17 <stddef.h> में):

offsetof(type, member-designator) 

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

static type t; 

तो अभिव्यक्ति &(t.member-designator) एक पते निरंतर मूल्यांकन करता है। और की line हिस्सा

offsetof(struct mystruct1, u_line.line); 

हालांकि, हम देख सकते हैं कि इस सवाल का जवाब हो जाएगा शून्य mystruct1 के बाद से एक union पहले सदस्य के रूप में शामिल है (और केवल),:

तो, आप लिखने की ज़रूरत यह यूनियन का एक तत्व है, इसलिए यह ऑफसेट 0 पर होगा।

+0

धन्यवाद, यह ठीक काम करता है, महान स्पष्टीकरण! – ken

0

आपका struct mystruct1 1 सदस्य u_line नामित किया है। आपको लगता है कि सदस्य

offsetof(struct mystruct1, u_line); // should be 0 

या लाइन नीचे सदस्यों यदि आप प्रत्येक "अपने पिता होने के स्तर पर" निर्दिष्ट

offsetof(struct mystruct1, u_line.line); 
offsetof(struct mystruct1, u_line.line.buf); 
offsetof(struct mystruct1, u_line.logo); 
0

सबसे पहले, AFAIK, offsetof का उपयोग केवल संरचना के तत्काल सदस्यों के साथ किया जाना है (क्या मैं इस पर सही हूं?)।

दूसरे

, लोकप्रिय offsetof कार्यान्वयन की आंतरिक विवरण मैं

offsetof(struct mystruct1, u_line.line) 

यह काम करना चाहिए की कोशिश कर सकते हैं सुझाव है जानते हुए भी। चाहे यह मानक-अनुरूप है मेरे लिए एक खुला प्रश्न है।

पीएस @ जोनाथन लेफ्लर के जवाब के आधार पर, यह वास्तव में काम करना चाहिए।

+0

"क्या मैं इस पर सही हूँ?" मुझे ऐसा नहीं लगता (जीसीसी परीक्षण के बाद)। जीसीसी ने 'ऑफसेट' एक्सप्रेशन पर "गहरे" सदस्यों को स्वीकार किया। – pmg

+1

@pmg: ठीक है, इस तरह के प्रश्नों का वास्तव में "परीक्षण" द्वारा उत्तर नहीं दिया जा सकता है। – AnT

+0

राइट @ एंड्रे। जोनाथन के जवाब में पोस्ट किए गए मानक से उद्धरण "गहरे" सदस्यों के साथ 'ऑफ़सेट' का उपयोग करने की अनुमति देता है। – pmg

2

इस पर पढ़ने के लिए एक महान लेख है:

Learn a new trick with the offsetof() macro

मैं मैक्रो offsetof अक्सर मेरी एम्बेडेड कोड में एक साथ के रूप में लेख में चर्चा का उपयोग करें, संशोधित sizeof मैक्रो के साथ।

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