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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?1 D- E1 X0 c' M/ w/ V/ Q
我调试发现他是取得那个字段的地址。
8 `! y+ s# J2 v' _* A  r7 ^大侠能详细解释一下吗?3 b; u7 D$ x2 l) M

# J0 `- b% `$ s% p: g这段是我Debug的用例。4 h- p5 q, |2 M4 ~
+ y) g; I( M3 X) U) g/ p# a
#include "stdio.h". Q9 J6 B+ o8 @) g; h
#include "stdlib.h"0 o6 ?9 S& G7 Y. e. E
#include "string.h"3 s! A3 z5 p( s- B/ ^
! z: n' `' V4 Y3 O# |& z8 \
#define        CHAR8                unsigned char
2 T) V7 Q7 ^4 C3 ]6 U/ i
. h! W/ B# Z3 F: R0 i$ Z" ltypedef struct _tagjany. N) s. f* A) s+ B9 m
{5 H) I  F+ ^+ A# R  y
        char name[8];! D& _8 K5 B$ v- D( I
        int  age;
- b- x' Q- \7 {, ]* g) `}JANY, *PJANY;- W6 A! n* b" W: r4 Z, v6 Z, I

2 Q. }: n" L/ q$ _3 Ntypedef struct _tagowen
+ o: H1 o- {; b) [9 b- m{1 k7 J# N6 u  w: q7 ~" Z( V
        JANY jy;; t0 @) M' z/ b6 W# e; A0 }
        char home[5];
8 n/ s" v; h& R" ^! S; w. l( _}OWEN, *POWEN;" Q4 s# i" g% [* T
' Z; _$ r  e. S% c0 O
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
8 n, c( M, @7 K6 N" y7 E
, d/ S( g7 d! L#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
+ J: N! Q' A; `( P) l6 P" |, v
% I  i/ A8 q& [3 d$ U. w8 g$ \#define PEI_CR(Record, TYPE, Field, Signature)   \. P/ c6 j1 T, H% b" S
            _CR(Record, TYPE, Field)             ' C' \+ c, w+ w1 V4 P% y' |
6 H; L$ I1 e; J1 t6 \' M
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \. O) ?4 x4 P8 x
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
& }) x! H: a, ]4 N
; r$ U3 F/ l$ A+ nvoid main()
! q* E- T& [" W+ v0 L{
! Z, A/ m4 y. ~5 o+ h6 G3 E        PJANY        jany;
) \8 n$ E' ^+ Q) L. U/ x        POWEN        owen;; }: r  S; j) X* Z5 _
        jany = malloc(sizeof(JANY));
; d. P# I' k/ s        owen = malloc(sizeof(OWEN));! F; a) Z7 b) e3 N/ a3 j1 \
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
" h& X( `9 x3 n3 `% L        free(owen);
; g: f, P' l! }) ^) r3 u) |        free(jany);2 s5 O+ D+ S6 U) M" w2 U
        return;       
. a1 h/ g  Y9 E}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
; W) _; X! B0 S7 {  z& D
% F! s; X; k& t& `' h' T你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。6 w6 g* ^1 Y% c* V; }- ?2 {
谢谢 “kelvinklee” 指点。5 H3 @7 G( l0 x8 `8 {6 \8 V
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
! W: r+ K' x/ w! k3 ].
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
4 I; m9 z# Y2 A; n0 r" m7 w输入:一个结构体成员的地址指针,该成员所在结构体的结构) Y# S- P& E- s+ C( ^) F
输出:该成员所在结构体的地址指针
; z$ ]( `) S) a$ f$ n. M0 ?
- y6 L6 h" |1 u# |8 z) |& K* \算法:
: q; l- G" k( {$ M' E, \1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
0 A8 Q  |2 \3 K6 M/ {2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 22:41 , Processed in 0.078965 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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