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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?8 T$ s. D0 c0 ~5 S2 ~* O& Z
我调试发现他是取得那个字段的地址。/ u( R; b. O8 L$ u  Y
大侠能详细解释一下吗?
! @: w6 d6 H) h# f6 _: a: ?7 R: R5 A' H
这段是我Debug的用例。
: p1 U5 F7 @. v, m- k" W' l8 l3 V
4 f( i, |& l, K' a: c' ]2 D. ?#include "stdio.h"+ ?- A; e0 t. ^3 }: Q
#include "stdlib.h"
8 |1 O/ A( b) k6 q0 V/ C#include "string.h"4 A: Z& d& |6 @5 e% O; a7 }. J
9 T0 N) [+ v* |) y
#define        CHAR8                unsigned char
. |& P* v5 K( H1 Y  W6 G3 v( [; B+ I! f$ @! r* L! J% k! s; @
typedef struct _tagjany
/ s2 Y: C7 @' J9 A% I{* Q& C$ b# S4 w0 @9 b  ]
        char name[8];& B  ]- \( e$ @$ m
        int  age;
2 ?: }  G- G3 E8 X: l6 ^4 f}JANY, *PJANY;
/ |$ s7 ]2 S! y+ K0 w7 i5 w
; d5 R6 I! e0 P. p  r- Htypedef struct _tagowen
3 I* W8 q$ s, M- Y; O8 C6 S; u{
6 |$ V0 c1 g8 a! I0 L        JANY jy;
5 _; }: [( L5 D; \        char home[5];( }1 r4 h1 \) ~+ M+ R. H
}OWEN, *POWEN;
4 ^' T3 e4 k- i* m" O3 D0 B5 e! n& V3 ?# n
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
0 R$ `' g* M$ g+ A3 L1 G% Q* b% l8 ]2 E! }- R% p; g
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))9 g) P& Y! g) b5 S: |$ i; }
5 k0 n% t% i( [9 e
#define PEI_CR(Record, TYPE, Field, Signature)   \3 R) w: h9 c$ P: v
            _CR(Record, TYPE, Field)             + d) Q2 E! E+ [; f+ w' I" `5 n
; ~& K+ k; v+ R* P/ [/ {
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
' \5 `( j$ A  z+ E" U  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))' P4 |, j7 R' h9 L8 L

& v. u5 H* e% h" n) @: D# wvoid main()1 J7 L$ g5 n3 u) j' p) O+ D
{
5 Y. o4 `4 T+ Q        PJANY        jany;4 T! C/ z3 R6 T4 y  w4 m7 t
        POWEN        owen;: U- n: G  x; z
        jany = malloc(sizeof(JANY));! Y6 k# h5 r9 d  b. Y5 S8 W
        owen = malloc(sizeof(OWEN));1 W+ [, e; G; }
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);( f( x  n' g+ l- G; k5 T' Q
        free(owen);
$ c0 S2 {8 v% W        free(jany);
* M* {& S( j: S  {        return;        ; q7 u. [- o6 h! q
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
! X1 W1 J8 Y+ k, \4 j
7 M2 B6 A* K5 d7 R7 g你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
/ Z/ j+ c% z- V5 F3 I谢谢 “kelvinklee” 指点。
- d# i- p6 b  {+ `5 O; Y5 m% \http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
% E$ y' o! d  F1 {' l. m.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
8 _. H5 L6 O8 s! m) t  O# w7 Y. N输入:一个结构体成员的地址指针,该成员所在结构体的结构
' ?4 l, Q1 e8 Y' l; |. u: i/ [2 X+ F输出:该成员所在结构体的地址指针% G2 W4 I4 p/ o2 j8 |( E% P

( i2 B2 J3 Z( X9 K5 t1 ^算法:' t  F; r5 t0 P
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
9 Q& x' T9 ^! v6 I9 T2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-25 03:39 , Processed in 0.040687 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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