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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?9 i; J  s8 O- d3 @, w4 q/ E% x
我调试发现他是取得那个字段的地址。
, {  r* ~0 [) w- ?8 c大侠能详细解释一下吗?* Z9 A* `# W% U

' |* F( Y- S. W& t这段是我Debug的用例。
7 `1 z. e+ b5 e6 n- d/ ~3 G
; N1 e8 L' f, W, j: r#include "stdio.h"  W: a( P! G! S/ |! r
#include "stdlib.h"
/ h# R, k, W1 v# o8 ^: r! u#include "string.h"" r: r* f+ C7 [& J3 G

! V! s. |4 `: i#define        CHAR8                unsigned char
! P3 v! N+ @3 }4 d& U9 \
& \# m, V2 T( W0 i% Ftypedef struct _tagjany4 ]( V1 ]5 `: }( ]( _3 A
{, M# l: @8 U3 M5 d
        char name[8];8 U6 ]. i; v7 l3 K% V
        int  age;
+ C& i/ o, S' s0 Z% ?9 Z, @2 j! z}JANY, *PJANY;+ y( {2 P+ p% ]. Y8 R

6 N1 E: n- u; G  r; }/ M& L' X5 ltypedef struct _tagowen2 n9 D! m3 t. \1 x2 W+ y
{
( @2 B3 t9 ?8 }# M        JANY jy;
/ [; I; {: V; b' Q- _) U+ @+ N- r        char home[5];
* y7 _( B1 a! B/ H& t}OWEN, *POWEN;
8 @* B$ c- j8 N9 l" D! v
" {5 w% l( E6 w: L+ |#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"2 E7 `. W, T- e; j8 {( ~
8 F3 J2 Y7 ~! t1 K1 J
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
+ c" v, H; `$ \2 U* F
" ^9 N8 \4 m- O3 R8 h#define PEI_CR(Record, TYPE, Field, Signature)   \
' N2 a7 c. s& D3 r9 _1 P0 z            _CR(Record, TYPE, Field)             3 p0 _; p5 m1 Y) _
6 V0 Y; p/ \6 M
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \1 i. k! B8 P- g9 |1 `! a
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))  l: Z3 {/ V, b6 `% T/ f9 q

# W, l3 I; ]. B% M5 `void main()
: y, `! H6 D/ l6 Y. I, T, W$ _{
. s2 J7 E; t, I        PJANY        jany;
! q+ a, j1 @# W; }( h, Z- ~# C        POWEN        owen;: K# k. ?+ f' l- `  c# j) [
        jany = malloc(sizeof(JANY));
3 ?. y  [# ~- w6 x0 i' B8 _0 @9 H        owen = malloc(sizeof(OWEN));( [1 ]* C% X" {* m
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);" S% _! c/ v4 q( o9 a6 t9 J1 x# H
        free(owen);
4 H8 s! P4 o6 u6 c+ M# W# R4 t4 ^7 c        free(jany);7 g7 p+ B; d, Z( K' f0 I
        return;       
- `3 w( f4 D' V- \1 u) g8 R}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。" ~0 q7 i2 w7 i/ }! [% b

7 x) Y$ _0 F- o; I7 T4 ~: F你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
+ Q" s, D, r  I# n+ ]; \谢谢 “kelvinklee” 指点。" L) C/ g* f" [+ }
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
0 R5 ^" I! k# v8 ?5 X6 m% y- c6 A.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
+ D- o5 W9 r" O" T+ @! U* B输入:一个结构体成员的地址指针,该成员所在结构体的结构. y, p1 ?, Z8 s) o: ^4 M8 S8 X
输出:该成员所在结构体的地址指针. |, p1 N' E8 W* R, S- S  J, F( O
$ _3 r/ P/ N8 d4 O2 k- @
算法:5 {. y' ~7 u1 y. ^
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量3 F; |2 M& D. Z
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 08:08 , Processed in 0.033331 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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