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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
1 z1 n6 s- o; i3 d' b6 l6 U我调试发现他是取得那个字段的地址。+ Y4 d/ C* ^5 L& h
大侠能详细解释一下吗?
6 R' O$ ]/ m  h  [2 y% R4 u' \0 ~9 `+ k. D/ W  `+ W) W
这段是我Debug的用例。
8 X1 P, Q2 Q+ Z( h3 @9 i* Z5 j# j7 Z' i; \2 L6 c" Y9 ]8 B6 d( p) p
#include "stdio.h"
) I% j" c2 {! V0 ?; M- P#include "stdlib.h"
; \; k* m$ f0 N6 |#include "string.h"$ I% E; o0 \2 |2 O6 y8 Q, A
+ ~( I7 Q( I2 ]7 V# B
#define        CHAR8                unsigned char7 }; W' Q! p6 m! n! C( {

; |. E; g+ H9 j& A, k7 Z$ c) N( Dtypedef struct _tagjany
: V% Z% i3 g: S! q& a' _{
* |  E( |' V4 ?4 x        char name[8];$ g  ~( u% O0 x: E( H1 e. Q- {# x5 C
        int  age;" J' f% A' I0 K+ U1 I6 `4 K
}JANY, *PJANY;
& ~3 T' x3 x- D* |; G
1 x! p3 h$ K$ D7 Ptypedef struct _tagowen* w0 R+ ]  H- Y& n  s$ V
{
- p7 R# d+ J6 [2 Z; K        JANY jy;6 c1 w9 I5 x6 [. P- ~3 {4 c" f
        char home[5];
  A  b9 K/ C# W}OWEN, *POWEN;! C( _7 B. }2 ?' r$ y" S9 Z, x4 N
- L, ^- I! K: o3 b# J  D
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
9 [" T$ }( j2 s3 P2 ~/ l  K' b$ Q& N* X$ `0 l
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))9 G5 W" I& N+ F, Z/ `9 ?% j$ i" [9 W
2 N# ?/ J8 U: o# z' h
#define PEI_CR(Record, TYPE, Field, Signature)   \
% J% t) y/ f2 ?7 T. O            _CR(Record, TYPE, Field)            
% t5 ~" G" r# K: [' B& T  i, z& k$ Y  f" r2 ^. f
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
9 M! S: Y& ]7 c/ ]9 \  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
1 r) S  o2 |, I' B8 W
; L; L0 z- @) \1 V* c) N/ d# cvoid main()( u$ l! D$ x" D$ l1 J
{- t# e/ `  X$ d7 o7 ?" K
        PJANY        jany;  c( f& r" L, ~
        POWEN        owen;
* r  Z! T6 d: A        jany = malloc(sizeof(JANY));
4 [. O5 X' l  q" s        owen = malloc(sizeof(OWEN));2 r( o+ G3 X* q) }6 B
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
# U' [; O0 T+ h% a- l1 E  [        free(owen);0 g5 t. K; }5 q& {
        free(jany);
- t  S' w$ D  T0 \* M        return;        9 |) ?  X8 y% j. F: p; P1 `2 ^! b
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。/ A2 ?- {  @: c& ^; ]

- O$ f3 t/ a& L* u# l# i+ N你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
5 e  e5 q) H2 }- @谢谢 “kelvinklee” 指点。
4 W' M! G. Q$ A, U) C, dhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
8 c' n" x6 ]( q; _0 V+ T.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
: q- Y4 R$ F4 t% b输入:一个结构体成员的地址指针,该成员所在结构体的结构& l1 y  H; \8 t8 u2 U
输出:该成员所在结构体的地址指针
' {/ a; S1 q" w/ t  W& d) M+ @0 ]4 C, q' B& R- u
算法:
" Y' f0 q: }) I1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量( N- L0 l# H) S) z4 F  Z
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-11 16:58 , Processed in 0.051103 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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