zoukankan      html  css  js  c++  java
  • EDKII CR宏:根据成员指针获取父结构体变量指针

    核心提示:

    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宏的定义
    1. //  CONTAINING_RECORD - returns a pointer to the structure
    2. //      from one of it's elements.
    3. #define_CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
    4. #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宏的使用
    1. #include"stdafx.h"
    2.  
    3. #define  CHAR8  char
    4. //  CONTAINING_RECORD - returns a pointer to the structure
    5. //      from one of it's elements.
    6. #define_CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
    7. #defineCR(Record, TYPE, Field, Signature)   \par     _CR(Record, TYPE, Field)
    8.  
    9. typedefstruct_MyStruct
    10. {
    11.     inta;
    12.     charb;
    13.     longc;
    14.     intd;
    15. } MyStruct;
    16.  
    17. int_tmain(intargc, _TCHAR* argv[])
    18. {
    19.     MyStructmyStruct = {10,'a',30,25};    
    20.     printf("MyStruct Address 0x%x ", &myStruct);    
    21.     MyStruct * pMyStruct = CR(&(myStruct.c), MyStruct, c, NULL);
    22.     printf("pMyStruct Address 0x%x ", pMyStruct);
    23.  
    24.     getchar();
    25.     return 0;
    26. }
  • 相关阅读:
    第五周学习总结
    第四周学习总结
    第三周学习总结
    第二周学习总结
    读《程序是怎样跑起来的》第十二章有感
    读《程序是怎样跑起来的》第十一章有感
    读《程序是怎样跑起来的》第十章有感
    读《程序是怎样跑起来的》第九章有感
    《程序是怎样跑起来的》第九章
    《程序是怎样跑起来的》第八章
  • 原文地址:https://www.cnblogs.com/herryzz/p/4908514.html
Copyright © 2011-2022 走看看