uEFI 的巨集 _CR( )
之前有了解到 _CR 是用來指到 資料結構的頂端(Header) , 但是實際上並沒有親自試過一次整段
今天在 online-c 的環境在做這個實驗,得到幾個重點
首先先貼出_CR
#define _CR(Record, TYPE, Field) ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
先看最後回傳值是一個 (TYPE*) , 這表示傳回來的是一個位置
再來Record是指目前指向的資料, 是結構的某處
假如一個結構元素叫 struct1 , struct1.name 就是這個Record指到的元素 , Record 是個指標 , 不是元素,這點要注意 (之前被困住太久)
TYPE 就是資料結構的型態 , 像是int , float 類似的概念 , 不是元素 , 算是宣告的型態 , 應該會是某個 struct
Field 就是該資料結構型態下的某個元素
以下舉個例子
typedef stuct{
int year;
char* name;
}hello;
void main(void)
{
hello data = { 1988, "edward"};
}
那 Record 就是 &(data.name)
TYPE 就是 hello
Field 就是 name
記住, Record 所指向的元素, 必須對應到 Field , 不然會算錯位置
留言