2.28.2008

CONTAINING_RECORD

PCHAR CONTAINING_RECORD(
PCHAR Address,
TYPE Type,
PCHAR Field
);
是一個MACRO,將 Structure 中某個field的offset 取出。
以上面的宣告來說,會 return : "Address" + "Filed" 在 strucure "Type" 中的offset。

這樣做的原因是為了避免 hard coding offset 在 source 中,造成 structure 內容變更不易。

這一篇 有說明 :


typedef struct _BUFFER {
LIST_ENTRY e;
UCHAR *buf;
} BUFFER, *PBUFFER;

...
PLIST_ENTRY entry = RemoveHeadList(&listHead);

PBUFFER a = CONTAINING_RECORD(entry, BUFFER, e);
為例, a 其實可以直接將 entry cast成 LIST_ENTRY就可以。

但是這樣以後 BUFFER 這個structure 若是修改的話,這樣寫就會有問題。

沒有留言: