找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 10141|回复: 4

请做EFI的大侠&前辈指点一下这个宏。-谢谢!

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?; r9 q8 d6 ?4 `' J) v( I
我调试发现他是取得那个字段的地址。; j( x9 K# |& k3 @; T  Z
大侠能详细解释一下吗?! w% r4 S: K' b
+ a3 z! O6 \- P/ i/ ?/ N0 U" s
这段是我Debug的用例。( |3 h' B% }  z
: z: l% o* G( d* f- G
#include "stdio.h"
( P0 a! h2 j# j' \2 S$ q5 ?4 c#include "stdlib.h"
6 r% {# u6 @; @1 W#include "string.h"
! L: Q, ~$ N7 P; @
, J6 c& _% i; B) M3 i8 @( n#define        CHAR8                unsigned char  o! u! X. e- O3 r4 Z8 O( p
$ x( y# h' z2 m1 w- n' x7 N
typedef struct _tagjany1 n: X( E$ F4 U# [0 ^
{
# Y* g' X, j( M+ c2 Z6 U7 A9 H6 Y. m        char name[8];
! p) S3 [( [" t. _        int  age;- s; N, l! Y, G1 n
}JANY, *PJANY;3 c) r6 a5 o- c% l& ~

& v+ ]$ R' x9 P& Z2 V" [) V3 s- \typedef struct _tagowen
) \! l* ], W7 ~5 `0 t{
( M( F  l- V4 ~" {0 n8 N% ]  d/ ]7 q        JANY jy;
9 n! b( d! v$ `! }2 V* [$ f+ U1 K        char home[5];
1 G, V1 _" }" e( n0 `7 I( ?}OWEN, *POWEN;
# |3 V' D" x: ?) V' \! G" x! K
: W5 m( v' k' ~" g4 Z- ?9 i#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"7 G- ?# h9 M7 I: }
  t6 f4 J1 Y! Y+ @/ c
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
9 ~2 o2 R$ h: {9 c3 [  R/ j; ?+ h' B- Q9 M, F
#define PEI_CR(Record, TYPE, Field, Signature)   \
7 J3 C2 \+ {2 b2 a6 w% ~& H            _CR(Record, TYPE, Field)            
4 O; }5 m9 f/ _3 i* o8 H0 ]/ ?2 M7 H0 s  C' g; a$ H
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \; E8 ^1 L  ~9 C. `2 `
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
4 C* p) W" c& w& u
4 t% r' t8 P4 x* r6 _void main()! t4 a1 S8 Q( v( A
{
) v. I9 s$ k( a& P8 X) m        PJANY        jany;
% `+ y/ \6 T- F3 u! T        POWEN        owen;$ q' m& s8 }4 X( }
        jany = malloc(sizeof(JANY));
! N1 ^& P9 |! u- ^: ?8 C0 H# I        owen = malloc(sizeof(OWEN));
" S2 G7 M' D( \7 g6 x- G        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);3 n$ A& H' p" k# G9 o5 G! L. H
        free(owen);
/ `" [. Z$ Y' q        free(jany);8 k; V) f: h! i
        return;        ! s1 Q( y4 r8 b' B/ M# U* w
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。; E" f1 Y9 _9 L5 C- {. z

) [# q" ~1 N* f' d你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。9 B  d6 B- S. r$ Z' k
谢谢 “kelvinklee” 指点。
! x+ U$ v- m  |http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
! j+ L  p0 V! V- d7 N& X, y.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!3 w3 E' Z& o: O4 W# K4 w% V
输入:一个结构体成员的地址指针,该成员所在结构体的结构: f: |# l  M- d# `8 w  u0 @
输出:该成员所在结构体的地址指针4 z- ?; ~% w/ P4 a: r

! n/ Q& u! [' ?& E$ \" j' X算法:# V0 n- v( q: T' R2 D4 P6 E* M% J  p
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
- {1 v* ~8 n6 N- k2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2025-4-29 04:56 , Processed in 0.056998 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表