2010-01-09 2 views

Répondre

14

Vous pouvez le faire en utilisant offsetof:

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

Je pense que vous avez un supplément '&' 'avant (ptr1)'. 'ptr1' est déjà l'adresse du membre. –

+0

Tout à fait raison, corrigé. –

+0

Vous devez également ajouter un ensemble supplémentaire de parenthèses autour du résultat de la macro entière - rappelez-vous que '->' a une priorité supérieure à '(type)', donc si vous voulez appliquer '->' au résultat, vous en aurez besoin. – caf

1

ce des fenêtres WdK

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