2012-11-19 9 views
5

statt definieren container_of als:die Definition von container_of Makro

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

Warum wird das nicht einfach funktionieren:

#define container_of(ptr, type, member) ({ \ 
        (type *)((char *)(ptr) - offsetof(type,member));}) 

was in der Definition der Nutzung der ersten Zeile ist?

Antwort

7

Es fügt ein gewisses Maß an Sicherheit ein. Mit Ihrer zweiten Version könnte ich alles für ptr übergeben und es würde gut kompilieren. Mit der Kernel-Version erhalten Sie zumindest eine Warnung, wenn Sie einen Zeiger für ptr übergeben, der nicht mit dem Typ type.member übereinstimmt.