2011-05-21 14 views
30

/include/linux/list.h'da linux kernel listelerinin uygulanmasında, container_of makrosunun ilk satırının ardındaki mantık nedir (aşağıdaki yapıştırılan)? benim bir örnek kod linux/list.h dosyasındaki container_of makrolarının ardında yatan mantık

const typeof(((type *)0)->member) *__mptr = (ptr); 

, bu satırı çıkarıldı ve

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

nitelik değiştirildi ve benim kodu hala beklenen sonuçlar elde edilmiştir. İlk satır gereksiz mi? Yoksa farkında olmadığım gizli bir tuzak var mı?

Ben Faq/LinkedLists

/** 
* container_of - cast a member of a structure out to the containing structure 
* @ptr:  the pointer to the member. 
* @type:  the type of the container struct this is embedded in. 
* @member:  the name of the member within the struct. 
* 
*/ 
#define container_of(ptr, type, member) ({      \ 
     const typeof(((type *)0)->member) *__mptr = (ptr); \ 
     (type *)((char *)__mptr - offsetof(type,member));}) 

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 

cevap

33

bulunan kod Bazı tür denetlemesi ekler. sürümüne sahip olan bu (uyarmadan) iyi derler:

çekirdek sürümü ile
struct foo { int bar; }; 

.... 

float a; 
struct foo *var = container_of(&a, foo, bar); 

, derleyici raporları: nasıl makro eserlerin

warning: initialization from incompatible pointer type 

İyi açıklama: container_of Greg Kroah-Hartman tarafından.

İlgili konular