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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
2 F0 c, Z) q2 F+ q2 o我调试发现他是取得那个字段的地址。4 [/ v' t, `  M$ ~
大侠能详细解释一下吗?
+ ~0 A& T' b: a6 t+ g1 v/ I8 F9 w4 N: f# `% G1 @/ k% W
这段是我Debug的用例。
* d1 D% Y5 }( B; S' X, N! V9 S8 {
: q0 @9 ~  Z( t2 M( l" I: s#include "stdio.h"2 p1 P; k0 z4 W1 l
#include "stdlib.h"- `! q& ~) U; M7 I% O+ p% c
#include "string.h"
) f: i4 O6 r! Y6 @% F/ w9 o! N- m  s% B2 ?5 p% J
#define        CHAR8                unsigned char! i5 [5 b% z0 B

( @. N* O/ o& i! X1 _5 k4 Atypedef struct _tagjany
1 o' n; u8 y# v" Z& I1 y{; m5 H/ ]- z% ^/ Y0 F2 z
        char name[8];
  o# H* H9 {! f5 \5 t        int  age;: u) j6 j, Z5 o! t& K3 E
}JANY, *PJANY;) j6 `4 r7 E/ ?
* G/ a& `' z% t7 `- j0 w! [6 x) G
typedef struct _tagowen7 ^) o4 c3 v6 `! s) T
{& |! L7 ?1 b+ P$ M! b0 m+ x
        JANY jy;
. c, ^3 `; y/ x) T  i1 c( p# m4 F        char home[5];
; b# J) T5 D! E$ {$ w5 w}OWEN, *POWEN;; e8 _3 k+ o+ {: b

1 J# U5 s- S9 e; O#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"/ {# q: P5 q  r- O) \6 {' D( d
; ^3 e$ R% ^2 W# V$ a2 z" B
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
. _/ C/ o$ t9 s  y! a) z( [0 J0 m, a' D
#define PEI_CR(Record, TYPE, Field, Signature)   \
* d7 @0 ^7 L- r- h            _CR(Record, TYPE, Field)             . W9 p$ l8 b9 j/ z  b. j
; ~$ t" o8 |% R& m3 Q; Q" C+ L# n
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \& Q! J8 a2 a* g) @) Z
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))  F% [% j- z7 p1 h3 H

* h8 K6 ]* q% B# N8 [6 ]" y. Yvoid main()
2 D! g. M, K5 x6 m  i{
6 G3 l( a0 _5 p, b9 k        PJANY        jany;3 y$ L% n* f& s+ ~9 T# l/ P
        POWEN        owen;
6 @  ]" h, W4 E8 y" c        jany = malloc(sizeof(JANY));
- Q0 e  [. b' l$ A% M        owen = malloc(sizeof(OWEN));
% M/ i; T* `$ ?( k1 C$ s- s        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);( G& }4 c- w1 m2 O
        free(owen);
2 g0 u2 ~+ I- P8 i1 |' V        free(jany);
% Y# n; C" _! q7 C% I0 X        return;        3 r4 t3 F# e% d* e- I
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
( c$ g% r1 `  ?- n$ _+ u
! }4 F3 h5 w7 x你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
  Y( t! q9 g3 V$ w谢谢 “kelvinklee” 指点。3 N% Q; d: d( A( V( C$ I3 G
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
  x! C0 d! f3 b: ]6 ]4 i.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!' e5 K0 l" f4 l6 f$ L. ~
输入:一个结构体成员的地址指针,该成员所在结构体的结构
5 P+ y$ w- X4 O" U  b4 E6 v输出:该成员所在结构体的地址指针
5 m+ K/ Y* ?* C- }: Q( t
# q) o) J5 k4 s算法:
' R, F9 k8 F- f; v2 ~& B2 O  x1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量' p- Y/ m- k- O! D$ E
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-14 05:12 , Processed in 0.034204 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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