• 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. }
  • 相关阅读:
    Python爬虫爬取网页图片
    Python爬虫爬取贴吧的帖子内容
    Android导入AS工程
    Arcgis for Silverlight学习(一)
    Silverlight学习笔记之页面跳转
    视频信号的垂直消隐和水平消隐[转]
    【DM642学习笔记八】色度重采样
    java从入门到卖肠粉系列
    [Selenium] Automation Test Manual(Selenium)
    [Selenium] Selenium私房菜(新手入门教程)
  • 原文地址:https://www.cnblogs.com/herryzz/p/4908514.html
Copyright © 2020-2023  润新知