_CR(Record, TYPE, Field)
来源:互联网 发布:什么是数据库中的事物 编辑:程序博客网 时间:2024/06/03 21:50
在看EDKII的code时遇到一个宏,琢磨了好一阵,写下来和大家分享。如有错误欢迎指出。宏如下:
#define _CR(Record, TYPE, Field) ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *)0) ->Field)))
底层code中会有各种结构体,这个宏的作用就是在已知某结构体变量成员的地址时逆向求出该结构体变量的基地址。宏中Record指结构体变量成员的地址,TYPE指结构体类型,Field指结构体变量成员。
&(((TYPE *) 0)->Field)是该宏的逆天之处,我等菜鸟由衷赞叹。
(TYPE *)是强制类型转换,((TYPE *) 0)是将数值0强制转换为指向TYPE数据类型的指针,相当于新定义一个(TYPE *)指针并将指针赋初值为0 !!!
&(((TYPE *) 0)->Field)是取该结构体变量Field成员的地址(用结构体指针运算符来访问结构体成员)。因为这个结构体变量的基地址为0,所以Field的地址就等于Field相对于该结构体变量基地址的偏移。
结论:&(((TYPE *) 0)->Field)是Field相对于该结构体变量基地址的偏移。
接下来连起来看 ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *)0)->Field)))
Record上边有说是Field的地址,&(((TYPE *)0)->Field)是Field相对于该结构体变量基地址的偏移,所以((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field))即该结构体变量的基地址,再经(TYPE *)强制转换就变成了指向TYPE变量的地址 。这里有一个强制类型转换(CHAR8 *) ,地址在相减之前都转换成了CHAR8类型,为什么这样?因为指针的移动是分粒度的,两个(CHAR8*)相减数值是多少地址就是多少,若是两个(UINT64*)相减,数值要乘以8才等于地址值,UINT64占8个字节。
- _CR(Record, TYPE, Field)
- Extracting Record and Field Metadata
- SetCursorPos for Error Record.Field
- Dynamics CRM2016 The value of field on record of type entity is outside the valid range问题的解决方法
- %type %rowtype record table
- Oracle type/rowtype/record
- Create custom field type
- Sharepoint自定义field type
- wss custom field type
- printf Type Field Characters
- Content-Type Header Field
- field has incomplete type
- TopSystem - Swap Field Value Form 2Record
- oracle record and table type
- django 字段类型 field type
- error: field ‘?’ has incomplete type
- error: field * has incomplete type
- oracle中的特殊类型:%type、record、%rowtype
- LESSCSS
- YTU-OJ-Problem O: A类设计--正方形
- 收藏网站31
- [DLX重复覆盖] hdu 3498 whosyourdaddy
- Android基础入门教程——2.2.3 TableLayout(表格布局)
- _CR(Record, TYPE, Field)
- mysql格式时间戳
- 收藏网站32
- 收藏网站33
- YTU-OJ-Problem P: A改错题--学生信息的输入和输出
- Solr配置文件 ----- 添加中文分词IKAnalyzer
- 汇编语言(第二版) 王爽 个人笔记
- Android基础入门教程——2.2.4 FrameLayout(帧布局)
- Core Aniamiton - 3