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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?9 W1 u  l" e; y  U
我调试发现他是取得那个字段的地址。4 x9 k& S! [( w3 N
大侠能详细解释一下吗?! \) x# ]# v( G+ I+ p7 b
! i; G6 S, B( |) T* W  n
这段是我Debug的用例。( d' W  @# T0 B6 ]1 S! x

3 W1 M0 U* q) X' P) i#include "stdio.h". |+ u* M( s0 f# S0 h# I! F
#include "stdlib.h") d% S' W5 l: v* N* o& C, |
#include "string.h"1 o: V* y; U! K, n: J0 t; ?3 i9 X+ v

) \# M& W- f# J, j: n. [#define        CHAR8                unsigned char; l2 D% f  Q* I$ K9 x
+ {7 z7 r/ [1 b9 B$ ]
typedef struct _tagjany# z& D4 G( y! t: r  Z9 f; e
{; E* f% a( R: J9 Q: H: |3 ?
        char name[8];, ]4 J% O& r/ N. a& k, z9 A% o* m
        int  age;
; O! n* h7 O* J! V! A& r}JANY, *PJANY;
$ S) b  O- c6 @# Q; o; ^, a' m& n1 T0 A5 I
typedef struct _tagowen+ i" J2 T6 \, X# h
{* l0 \8 A; O8 h" {) m$ t$ ^
        JANY jy;
1 e: ~7 r2 W; K* o% ~" I        char home[5];
! o: l% q  j9 H) F( G% ^}OWEN, *POWEN;/ L6 l0 \6 l! `& J: w) M6 C

, d1 c4 ]! M+ K$ |#define PEI_CORE_HANDLE_SIGNATURE "owen.lu". }$ I$ @9 t2 W; |. s6 ?; x

4 L5 I. o, L3 E0 J: {7 f#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
  B; M/ |& X2 H9 Q4 ]. X3 _5 k
) E4 v( v) d8 i% q' E: m7 w#define PEI_CR(Record, TYPE, Field, Signature)   \( g& j" Y+ \' H3 ]8 K7 S1 {' c
            _CR(Record, TYPE, Field)             % }: k: C+ J2 t0 |" Z6 p# B7 `
1 H( t, I9 h* ?1 J/ f. C, E
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
6 x6 f0 k# H. ~1 I5 A6 v  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE)), j7 b9 M6 L# h. h, B- f: H

$ f6 l' `5 \- ]' {void main()8 {, o; l/ l9 e" H' S
{; M% Q$ R1 h# k) z. R+ M
        PJANY        jany;' G/ }! `9 \+ a. g! I$ y' }
        POWEN        owen;
2 v3 Q+ l) |" K8 {) ?8 ^        jany = malloc(sizeof(JANY));
' b. Y( W$ N9 H* F* Q1 T- {        owen = malloc(sizeof(OWEN));
' ?) Q) K' a( L/ ]        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
! a1 x+ h) `( f% N9 b- {# V        free(owen);
8 z5 x' L1 A) v        free(jany);  l  O% ?  x5 s% u$ F+ {" K: W* a
        return;       
! W; Y! ?# \8 H1 f4 E' U5 _. r}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
! N! q6 j. R( C6 H1 l* G2 d2 T% t" Z
2 Y' Q5 s5 N7 @2 v4 p你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。8 I. O3 l. d; }( ]9 T* B
谢谢 “kelvinklee” 指点。
- W( t* c4 Z* Xhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                4 w4 A* p# F9 g& K3 G
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!) h, O8 M, ~8 ?$ h
输入:一个结构体成员的地址指针,该成员所在结构体的结构8 M+ R# Y/ t9 e/ ]$ x9 n5 h" M; M- l
输出:该成员所在结构体的地址指针$ F1 |1 u0 E3 [+ ^; V0 f
% A3 ^( {  e% _
算法:
( S# ^. G& e" c( w+ Y2 K1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量2 S3 t5 s* S% m+ ?5 r& `: n7 W! E. h
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-19 21:04 , Processed in 0.051882 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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