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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?; w- R/ L* }2 h" X1 [( ?
我调试发现他是取得那个字段的地址。
5 x" P9 z! t: D0 L- q$ G大侠能详细解释一下吗?
4 i* i% I3 t3 C7 N9 c, l, k* ?4 j- h0 h. N7 p- W
这段是我Debug的用例。
6 t5 r% K5 b1 T) E3 X
4 }) x: e$ e7 x/ {' R* r#include "stdio.h"
8 y( ?) H4 ^8 d; s0 p#include "stdlib.h"
6 E" m) ~# f- B: r+ l#include "string.h"3 \# {/ U& g, g
: |- G; l$ l. i- ]" B7 x$ f/ K! L
#define        CHAR8                unsigned char$ c9 |% Y7 l/ e6 @4 \

7 ?/ f* o6 w( f7 V& ytypedef struct _tagjany: v% |  @  C; W2 D& N
{
' }/ g- C/ }9 B& c. l4 _. p9 I        char name[8];
+ I, f5 v5 G. s& p9 z; Y# J; N        int  age;
, v; x4 v4 S& M* ^. \}JANY, *PJANY;, W+ @* v- ?3 M% I( o" a* ~
' k7 I: F: [' s* a' \
typedef struct _tagowen! k2 K# S- L/ C  o! |
{
3 T) q3 _6 c9 M. L$ a        JANY jy;/ H: N" G. O2 N0 [; w
        char home[5];
7 }7 g7 ^5 f, w2 s& H}OWEN, *POWEN;
- b5 ~, a8 V, S5 z. ~% }( J/ f( v! V3 [/ n$ q
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
8 [6 u' y7 o9 C9 b% }6 l+ B* Z) d  s  H: \: t# `8 ~+ S
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))& b, p0 t& O% u/ C+ q3 U! A

6 r1 A  ~1 s3 i1 M#define PEI_CR(Record, TYPE, Field, Signature)   \6 L$ e: y) o3 F
            _CR(Record, TYPE, Field)            
9 Q; R1 n3 S: u" P  e. v
4 X2 h  [8 D* T6 l) U" Z! h#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \3 G, M5 y0 i: a7 _+ \# |' p% ~- C
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))2 v+ s& l' A* U: K1 K0 w- i

/ D' p& S& W5 cvoid main()- v3 D( t: h+ x. Q" z
{- k4 h' J* i9 _$ f
        PJANY        jany;
- N) `2 _- r, H        POWEN        owen;
. W8 Z/ l7 D  h2 ~& z        jany = malloc(sizeof(JANY));
& i, i; D6 V( _6 w% Z6 c; ?( w        owen = malloc(sizeof(OWEN));& B& `5 a, R+ p. Y8 I% U0 r
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
) }' z- f2 x0 N) ?9 Y6 r        free(owen);
5 Z5 Q) b% t6 Y- N5 s- P        free(jany);0 V6 R6 H! _- [( ]
        return;        1 I8 ?2 \: ?; Q/ A
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。: z* h' U* T6 \  J
0 I$ O, Z7 f' U. [/ w# [. y
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
9 X1 o, s0 i4 j! E+ _+ W  ]% ]: c谢谢 “kelvinklee” 指点。
' [: v2 K8 ]/ G, l, b  h4 U1 B, R# Fhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                4 I) g: N. X  X% p, i8 j
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!6 e' t4 D: x- _# ~
输入:一个结构体成员的地址指针,该成员所在结构体的结构
. S" V2 W' M# C2 T+ Q7 Z; U  Q输出:该成员所在结构体的地址指针
5 \% Z! M( x) t6 A/ J3 h/ T5 T: K: d- ^7 `# h6 d6 ]
算法:
2 M: ]5 K* x, X  }# K1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量& I3 L$ q! j" n/ _4 U; [
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-21 22:16 , Processed in 0.133321 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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