標籤:
核心提示:
1. CR宏 (Containing Record):根據成員指標擷取父結構體變數指標
2. 0 指標的妙用。
在EDKII 的代碼中有不少關於CR宏的使用,如 時鐘中斷處理函數CoreTimerTick。
VOID EFIAPI CoreTimerTick ( IN UINT64 Duration ) { IEVENT *Event; ... if (!IsListEmpty (&mEfiTimerList)) { Event = CR (mEfiTimerList.ForwardLink, IEVENT, Timer.Link, EVENT_SIGNATURE); ... }}
CR宏的定義
- // CONTAINING_RECORD - returns a pointer to the structure
- // from one of it‘s elements.
- #define_CR(Record, TYPE, Field) ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
- #defineCR(Record, TYPE, Field, Signature) \\par _CR(Record, TYPE, Field)
CR的用法: _CR ( 結構體某成員變數的指標 Record, 結構體類型定義 TYPE, 結構體成員變數名 Field );
這個宏定義的關鍵點是 0 指標。 結構體調用 Struct –> Member 是 把Struct的指標 加上 Member的位移量, 0->member的調用可以直接得到 member的位移量。 這樣把member的實際指標 減去 位移量,就是這個結構體本身的指標。 很巧妙的用法!
下面舉例說明:
CR宏的使用
- #include"stdafx.h"
-
- #define CHAR8 char
- // CONTAINING_RECORD - returns a pointer to the structure
- // from one of it‘s elements.
- #define_CR(Record, TYPE, Field) ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
- #defineCR(Record, TYPE, Field, Signature) \\par _CR(Record, TYPE, Field)
-
- typedefstruct_MyStruct
- {
- inta;
- charb;
- longc;
- intd;
- } MyStruct;
-
- int_tmain(intargc, _TCHAR* argv[])
- {
- MyStructmyStruct = {10,‘a‘,30,25};
- printf("MyStruct Address 0x%x \n", &myStruct);
- MyStruct * pMyStruct = CR(&(myStruct.c), MyStruct, c, NULL);
- printf("pMyStruct Address 0x%x \n", pMyStruct);
-
- getchar();
- return 0;
- }
EDKII CR宏:根據成員指標擷取父結構體變數指標