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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
2 _# @& N/ x3 a! D; r, S我调试发现他是取得那个字段的地址。1 f8 O3 E% M+ y) s
大侠能详细解释一下吗?+ ?* F( R* Q( I3 P

7 K% S! |8 ?4 i' K这段是我Debug的用例。
' {1 s  D3 Y1 r7 Y$ k7 x% ^; j+ F' e& x4 p! i7 E* c* N6 s2 C
#include "stdio.h"
2 h) n1 x; A( V, D' e#include "stdlib.h"; e! }( S( Y: M/ L
#include "string.h"
/ t; V9 Z( H$ t: [8 _6 W
" W5 O6 l4 L# a# q& o" `* Q#define        CHAR8                unsigned char% A- z* |5 G$ y* x. f' L  p) D
9 N8 _0 R4 D* {6 r. d
typedef struct _tagjany( s  \6 c3 q6 q6 h8 S" J
{
( K$ Y+ M) w' v- G: b* s% t5 |        char name[8];
7 G; P8 A" ]! h. f# w        int  age;2 d+ W, R* Q! T# W9 w& h
}JANY, *PJANY;
& M+ G( o9 a4 `2 ]0 v4 d
0 K' B* t. w) S$ C2 C1 C. Htypedef struct _tagowen4 N' V+ O* }9 Q( Y( V
{. h7 {5 J9 d5 V  |6 b1 w6 `* H" n" h
        JANY jy;
( f9 t( u5 P, r) V; C2 n: P        char home[5];
: J$ R' [# V6 @6 W6 d}OWEN, *POWEN;4 c/ R# q# ]4 ?1 V

% ~! S1 @2 m9 I  h#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"% I# {' W. d1 n. _7 x5 _
7 P) p7 B: S3 N& y# Z6 {
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))* a8 v+ l7 q: K5 G! f, q# O

6 [* ]+ Y" C2 I#define PEI_CR(Record, TYPE, Field, Signature)   \
7 k: v' s0 H4 Z1 M% b' t7 c; [' u$ `            _CR(Record, TYPE, Field)             % e$ k$ M$ ~$ T' ]
, ]4 a  a9 M/ Z0 C3 M
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \/ r. l3 z7 E9 {* {) w$ E  P( G
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
0 G9 D9 @) D: q4 j  I9 v3 |6 |" d1 b) z0 T2 H. A8 q4 O: N$ [
void main()
) x. y. I2 Z9 V( v( X+ ~* L4 l* \{$ w" W; O' D. ~! n
        PJANY        jany;
3 \9 ^2 J1 p6 T  y" i9 }. H, Y2 D        POWEN        owen;
5 d; X4 P0 M2 d+ y4 i        jany = malloc(sizeof(JANY));
% q. _, S- ^3 }- ~        owen = malloc(sizeof(OWEN));
. e1 D5 ?3 N  a5 Q9 ^: D$ b        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);6 C" e  ?6 O( U
        free(owen);
* j, }! G% D3 q$ @        free(jany);1 y; l3 C: x/ H  f5 T1 {7 W
        return;       
/ Q% \! z" G3 e# K) t}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。2 c$ I( \' ~9 k  |0 x
! S& D6 ^7 B4 Q# c0 k- D$ B5 }
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
9 p  ^1 U9 R+ Q" L谢谢 “kelvinklee” 指点。, @; j) |+ t, m( l
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
% l; V# o, k! N! Y! j: S+ ^.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!+ n" G3 b  r: r+ \) a
输入:一个结构体成员的地址指针,该成员所在结构体的结构
# k! b; p+ b, r8 C% p6 u输出:该成员所在结构体的地址指针
, e2 N4 J1 s$ ~5 B5 o" {) T% k- K
* f1 {# K# E; N  K, V算法:  S* S; M. x1 ?3 Y! f% M4 G
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
/ ]- ^0 h- P7 m) @0 k1 b' h3 C2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-1 17:39 , Processed in 2.968752 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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