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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?' ?9 L# {+ x  \  k
我调试发现他是取得那个字段的地址。  _1 S4 `9 c+ B* J
大侠能详细解释一下吗?; G! }2 ?. q( o* }6 ]2 k

* ~2 f% e" H6 E' {" t这段是我Debug的用例。
& T1 e5 d: `; e' K: D* r: _' k0 ]) o: m2 ~
#include "stdio.h"8 f& h! ]: \& ]+ n8 |7 s4 m
#include "stdlib.h"7 M# e, L  j5 z4 S2 }2 b
#include "string.h"
2 L! R. d/ R. ~3 T6 k5 C4 M8 ~! `! g" b4 v
#define        CHAR8                unsigned char
- A+ E. i- c8 f. n5 B' |3 _5 u
! D. \% Y$ c" _typedef struct _tagjany3 o$ b* n* B0 ^
{
" T" E+ D( ^$ l0 g) i' M& J        char name[8];& T5 q% e% ]& r5 a% z  \# B- P
        int  age;  r6 j; O+ }% e3 i
}JANY, *PJANY;" j8 L; b! q# ]. G  t: D7 k

# F( q6 {$ P; t# Y9 q. ]typedef struct _tagowen3 s, V: V8 S0 h7 C
{
$ n& V( l; F+ |8 e) u9 T6 ?        JANY jy;/ S; w# V% ~6 u
        char home[5];/ x" {& f" c* m0 ~, I
}OWEN, *POWEN;3 u# X3 M( \7 L  _2 G* b5 C

9 T" V! _# _8 F$ o/ R# U$ b#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"- G0 j! l3 ?! A/ e0 O: i8 Q: \

9 S( ]; {+ F2 u& R! z#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
: E% A- @; K+ H$ n: `+ A' D
' O  h  ~" G# r) @8 O5 y#define PEI_CR(Record, TYPE, Field, Signature)   \8 ?- p" q. Z& d5 J( G
            _CR(Record, TYPE, Field)            
  o+ F$ @" c' ~" @1 |' P9 a2 j* S7 G  |- h( Y
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \# c2 l# S# Y2 I4 r; o. u* O
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))0 h4 t, }3 p# n& Q- `7 B  S* U
9 ]; W( F  y6 L* d
void main()
  i( n. ^, X- f% K4 A0 v/ Y{
6 z* W, {" K$ b        PJANY        jany;
+ C3 q$ ^& U* H0 E8 M( M' E7 E        POWEN        owen;1 p# b' l3 F4 F& m9 X: W& {
        jany = malloc(sizeof(JANY));5 |9 t# L) m! e9 h# j
        owen = malloc(sizeof(OWEN));
+ c. c  m: n8 ?6 ]$ f        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);. k& [- a4 A3 m' P5 J
        free(owen);, u: `" I( N/ Y- `( D
        free(jany);
6 t' _+ |* I; ~$ T$ {        return;        3 e3 _% p4 J: c
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。1 z$ q0 d4 l* b* H& u
) Q0 h: Y: ~, a- K
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
! u& r+ J+ l; a谢谢 “kelvinklee” 指点。) O# f* y. f- p4 D6 w9 c# `
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                5 P0 O( N. u# Q0 |- e0 z1 u
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
+ _! m1 M2 A8 X- w% g输入:一个结构体成员的地址指针,该成员所在结构体的结构
* [9 M3 {8 S) U/ |( H输出:该成员所在结构体的地址指针3 e" t* E1 {2 K/ M
6 {2 L) ]1 D4 n. j* }7 `% k  N
算法:
3 R3 I$ s0 {" `6 @8 x# W  d2 p. L0 H1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
( P1 J& z8 L: n. V5 |9 g) a2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-3 23:12 , Processed in 0.189347 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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