2011-11-15 20 views
6

linux में, container_of मैक्रो प्रतीत होता है "अतिरिक्त" कोष्ठक में संलग्न है:हमें ब्लॉक मैक्रो के आसपास कोष्ठक की आवश्यकता क्यों है?

#define container_of(ptr, type, member) ({ \ 
       const typeof(((type *)0)->member) *__mptr = (ptr); 
       (type *)((char *)__mptr - offsetof(type,member));}) 
यह करने के बजाय

, हम बस

#define container_of(ptr, type, member) { \ 
       const typeof(((type *)0)->member) *__mptr = (ptr); 
       (type *)((char *)__mptr - offsetof(type,member));} 

उपयोग कर सकते हैं?

क्या ब्रांड्स अनिवार्य हैं या वे केवल सावधानी के लिए हैं?

+0

यह जीसीसी में चिह्नित किया जाना चाहिए न कि सी से ....... –

उत्तर

11

यह आवश्यक है। इस्तेमाल की जाने वाली "चाल" में से एक जीसीसी का statement expressions है जिसके लिए इस 'अजीब' ({ code }) वाक्यविन्यास की आवश्यकता होती है।

इस मैक्रो का उपयोग करने वाला कोड अधिकांश उपयोग मामलों में इसके बिना संकलित नहीं होगा (और यह मान्य नहीं है)।

यह भी देखें: Rationale behind the container_of macro in linux/list.h

और: container_of ग्रेग क्रोह हार्टमैन द्वारा।

+0

आपको बहुत बहुत धन्यवाद! – SHH

9

({...}) एक ब्रेसिड समूह है, एक कोड ब्लॉक जिसे अभिव्यक्ति के अंदर उपयोग किया जा सकता है। अंतिम बयान इसके मूल्य को निर्धारित करता है।

मैक्रोज़ के अंदर आप मैक्रोज़ को कार्यों के समान व्यवहार करने के लिए इसका उपयोग करते हैं। अधिकतर static inline फ़ंक्शन बेहतर होगा।

संबंधित प्रश्न:

+1

बहुत बहुत धन्यवाद! – SHH

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