2012-11-19 6 views
5

invece di definire come container_of:la definizione di macro container_of

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

Perché non sarà questo semplicemente lavorare:

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

qual è l'uso di prima linea nella definizione?

risposta

7

Aggiunge un certo livello di sicurezza del tipo. Con la tua seconda versione, potrei passare qualsiasi cosa per ptr e sarebbe una buona compilazione. Con la versione del kernel, riceverai almeno un avviso se passi un puntatore per ptr che non corrisponde al tipo di type.member.