2012-11-19 18 views
5

की परिभाषा:बजाय के रूप में container_of को परिभाषित करने के 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) ({ \ 
        (type *)((char *)(ptr) - offsetof(type,member));}) 

परिभाषा की पहली पंक्ति का उपयोग क्या है?

उत्तर

7

यह कुछ स्तर की सुरक्षा को जोड़ता है। आपके दूसरे संस्करण के साथ, मैं पीआरटी के लिए कुछ भी पास कर सकता था और यह ठीक संकलित करेगा। कर्नेल के संस्करण के साथ, यदि आप ptr के लिए पॉइंटर में पास करते हैं तो आपको कम से कम एक चेतावनी मिल जाएगी जो type.member के प्रकार से मेल नहीं खाती है।