2010-01-09 18 views

Respuesta

14

Usted puede hacer esto utilizando offsetof:

#define start_add(ptr1, type1, member1) ((type1 *)((char *)(ptr1) - offsetof(type1, member1))) 
+2

creo que usted tiene un extra '&' 'antes (ptr1)'. 'ptr1' ya es la dirección del miembro. –

+0

Muy bien, arreglado. –

+0

También debe agregar un conjunto adicional de corchetes en todo el resultado de la macro; recuerde que '->' tiene una precedencia mayor que '(tipo)', de modo que si desea aplicar '->' al resultado, los necesitará. – caf

1

esto desde ventanas wdk

/* 
#define CONTAINING_RECORD(address, type, field) ((type *)(\ 
     (PCHAR)(address) - \ 
     (ULONG_PTR)(&((type *)0)->field))) 
*/ 
Cuestiones relacionadas