2010-01-09 62 views

回答

14

可以使用offsetof做到這一點:

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

我認爲你有一個額外的'&''之前(PTR1)'。 'ptr1'是該會員的地址。 – 2010-01-09 10:54:44

+0

非常正確,固定。 – 2010-01-09 10:55:17

+0

您還應該在整個宏結果周圍添加一組額外的括號 - 請記住' - >'具有比'(type)'更高的優先級,所以如果您想將' - >'應用於結果,您將需要它們。 – caf 2010-01-11 01:16:06

1

這從Windows WDK

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