2012-11-19 93 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,它會很好地編譯。使用內核版本,如果您傳遞的ptr的指針與type.member的類型不匹配,您至少會收到警告。