2010年10月5日 星期二

EFI中的CR (CONTAINING RECORD)

在EFI中常常可以見到CR這個define,而這個define的作用是,當擁有某個結構成員的位址時,但卻不知整個結構的頭在哪裡的時候,就可利用這個方法來取得整個結構所在的位址,此為CR的定義:
#define _CR(Record, TYPE, Field) ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
Record:為該成員的位址
TYPE:為該結構的型態
Field:為在結構中指向的該成員

這個方法可以分開兩段來看:
(CHAR8 *) (Record):該成員的實際位址
(CHAR8 *) &(((TYPE *) 0)->Field):該成員在結構中的偏移量

兩個做相減之後便可取得結構頭的位址,最後再來個(TYPE *)作強制轉換。

沒有留言:

張貼留言