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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
2 H# A5 }' Z6 B- Q- K- M9 }我调试发现他是取得那个字段的地址。
  n7 J, {3 y2 G  U# \4 g大侠能详细解释一下吗?
% g- m: e. }2 C9 _8 S' e( g: X
6 M1 k3 `% E4 K- ]4 q1 d这段是我Debug的用例。8 h+ n. K: ]+ S# m: J

/ p+ b0 N2 ^% n" b#include "stdio.h"+ Z! R+ U6 O) E' [, a8 Y" ~+ K
#include "stdlib.h", X: n$ H* K+ b
#include "string.h"8 u) ~. O/ ]' d* I0 `. G
0 i/ R7 w& t" k6 d% i  j) k
#define        CHAR8                unsigned char
: V% S" n# _1 P; r! E
1 ^1 n1 S! Q$ l3 A, H' W- i5 Dtypedef struct _tagjany/ ^( W- K0 Y6 M  u$ i5 D
{  W) ~+ x% o) E4 l; [
        char name[8];
9 y% i& z: e: j% C7 b, i1 {        int  age;
# D4 j6 e+ V2 c8 h- Y$ @7 {) N}JANY, *PJANY;# n2 S7 }% E9 t" l
3 @" s$ Z3 H" z( C, R6 x) e
typedef struct _tagowen& g' O1 w( B& ?* z  W4 J/ O* E0 z1 w
{
/ w0 V* H2 W# i7 n, X  e+ \        JANY jy;
# ]) |* s7 ?. n) c        char home[5];
3 I, _1 |5 g, z}OWEN, *POWEN;
4 d  O1 }7 d% M9 Q: J& W! V8 k2 H# K8 [
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"% P: J- ^( _: N; n& E/ ~
- u* H# g+ ^  k& s9 e  D- e+ y
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
% w( q7 `8 ~* E
4 n" X& Q) G: z#define PEI_CR(Record, TYPE, Field, Signature)   \
/ T# S* P# V# _* A* z/ F            _CR(Record, TYPE, Field)            
) g: r1 B3 `3 T4 }3 o1 @
1 D2 o- V3 i& h9 g1 o#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \0 {$ u7 z' }; `0 U# q
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
8 b/ {$ c. u3 l" b( \
0 z) \& j6 T: R7 m7 Q( hvoid main()( @6 n/ x6 W  C4 p4 j! G* t* q
{. d( c( H7 X0 X: L$ u8 ^
        PJANY        jany;
, z. ?. Y! j2 q0 D' N2 T        POWEN        owen;
; |8 ]+ R: n- D- ?3 o1 @        jany = malloc(sizeof(JANY));. e# H+ R9 M9 w! U7 y' a
        owen = malloc(sizeof(OWEN));
$ D3 Z6 m/ s6 {  Y1 E        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
+ U, }/ g7 }& K8 b        free(owen);* _! R2 Y3 u  E
        free(jany);
" H: j& j. G# s$ Y6 R  W        return;       
0 Q1 u6 Z( K7 m  ]6 e- C% k  M: l% ~0 X}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。0 |4 x2 j5 F' O8 x

" z, o4 _" c( J+ N) B8 i0 `8 u你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
3 u3 l1 b/ j! W& [+ E谢谢 “kelvinklee” 指点。
+ ^+ c7 v, f( v1 o7 F# P( Y: _http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
* I  C* B7 ~: H3 u.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
9 T5 g+ U  U8 H. o0 [* Q输入:一个结构体成员的地址指针,该成员所在结构体的结构
) Q4 F! \" ~& ~  d3 o输出:该成员所在结构体的地址指针! P$ N3 P/ t; b7 \; |2 H& ^

$ ?; q! v! Q. A3 q算法:" S( \4 R& a& z1 [* \3 |- ^: V
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量& ]- [7 S0 Z. L5 {: x
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-15 08:25 , Processed in 0.522459 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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