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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?; w% z) n- z  T& R5 Y
我调试发现他是取得那个字段的地址。2 K( k7 w* y2 R( `3 B1 P
大侠能详细解释一下吗?/ O' j+ g, T8 O
' R2 q* ]  l: P* \
这段是我Debug的用例。
  J' t7 R, M) |/ q! Q
/ P4 `& C) O$ s7 s* e' d#include "stdio.h"
4 z  P5 L  T: s' ?#include "stdlib.h"
% W* V' ?+ j: i! g: {% P#include "string.h"& R9 X& D$ z( z- |

3 S1 T2 Y' x7 }( ?#define        CHAR8                unsigned char
% ^9 r. r& Y& T3 r, o2 m4 u  t. ], e0 z! P, t' _% a
typedef struct _tagjany+ \4 K3 u% G7 @
{
, V5 N/ t7 B& j0 n        char name[8];* B' f- m  h8 d' c" y$ k
        int  age;
$ P3 q  t0 n7 S+ D* g6 x, F}JANY, *PJANY;9 j/ Y, c9 O- Y1 T: k+ G

& {8 a6 m5 O9 |5 @typedef struct _tagowen
# X' S) g: e/ e- p' D{1 D& V  `. E3 ~# o* ?
        JANY jy;4 L* t: K2 N: w* j& R. x
        char home[5];* G+ I! ^) |7 Z( X$ q) L5 l+ O/ }( |
}OWEN, *POWEN;
3 G+ j$ }' Z5 s" X
* h+ X% m# Q  X/ X#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
. b! ~" G0 N+ w+ E% Q9 C; y3 E* [
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
$ d/ t$ V2 ^/ Z8 R* K) u
6 Z2 y) a3 ^/ J! q& d! H$ p3 |! o#define PEI_CR(Record, TYPE, Field, Signature)   \( Q! P( J7 _# {! T4 O- e
            _CR(Record, TYPE, Field)             ! K$ |5 c# p* m, z4 z

1 E& h. B; m7 O7 ^! K#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
/ z7 ^, L7 U( T$ J7 a  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
9 t2 f2 T; e& `
/ R0 n! s% g$ R; pvoid main()
0 N& X" F; k; ]) c( R{/ x: G/ _) M  G4 W
        PJANY        jany;
2 C6 G+ n9 b* B        POWEN        owen;
0 _% _. e7 v8 n* \$ K$ n! ]3 ?        jany = malloc(sizeof(JANY));
- Y& W! w/ u: ]$ T        owen = malloc(sizeof(OWEN));1 t& z6 m- I: F. Z+ x' U  _
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
) m0 ^4 t& y. i; {3 g% g! T) v        free(owen);, v( J$ y) i+ W2 I7 e- |
        free(jany);
$ E' K8 g% S9 G+ k        return;        ( F5 P0 k1 N4 a+ S+ b9 q
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
' Q' G& L; k- p! M
( v3 n) w- }1 a! x3 f) |你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
3 G4 k3 K( d" _. K. |) B谢谢 “kelvinklee” 指点。
7 V% B6 v7 K3 t: S) U$ D( Dhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                  G& |" |7 w$ m
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
- ~. R* _; w1 x输入:一个结构体成员的地址指针,该成员所在结构体的结构, I+ H5 p- R+ V- L. K0 f: j
输出:该成员所在结构体的地址指针/ h- D9 \  c% x: a

" T( a" u5 s; p- w4 w算法:) B7 ]/ R  e2 F& H$ F3 h* Q
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
" |( u2 p* U3 D; I% ^/ |% c2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 01:44 , Processed in 0.090302 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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