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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
2 H" g7 I6 ^2 J9 i! N! e, ~: H我调试发现他是取得那个字段的地址。
2 k( A6 T  ?3 h$ ?6 I5 |( {# |5 r1 }大侠能详细解释一下吗?
' O5 P& R! G+ y+ l! v; }+ E) p; K( ^2 O& {: [
这段是我Debug的用例。
8 D7 F$ L; P$ T1 N
; d# D. {9 l9 @1 z4 T/ g0 |#include "stdio.h"
. S- c) @9 o: u6 w" `#include "stdlib.h"4 s& i( W  R( L- Z0 W' p
#include "string.h"" Q& E- B; o% j7 `! S
5 q4 q" ~6 ]  |, C; u& d1 K
#define        CHAR8                unsigned char- P6 n! ^5 f% d3 E9 c
6 e9 R3 D3 K, |* i7 n& F1 y8 P' B/ N
typedef struct _tagjany
, u" ?) I& S' h* l3 S! m  h{
/ b: `. H  U' K4 a        char name[8];3 |) j) V; y, Q' s9 _  a% {8 W
        int  age;4 m$ y) Z' Z5 P0 X9 b2 U0 r/ V, F
}JANY, *PJANY;
! [0 ]2 |7 p3 }1 L) Q+ n4 C
/ R$ ~0 a2 N' U$ U6 G- G7 mtypedef struct _tagowen
0 T$ A0 N2 ]; Y- S: W3 d{: p; O. U0 Q5 a3 n; \
        JANY jy;
) \; P. P9 S$ ^8 Y4 Q        char home[5];
. a! D! N8 K. ?0 H5 W! u, y3 M}OWEN, *POWEN;
# M& Q& J& E4 _6 ]
2 J- x5 l( s+ S( `6 o#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"/ P4 w. a$ H! Q" x& E
1 ]* `" F+ M4 S4 \1 A. m7 b8 Q
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
# k* i& T" b$ |  R; ^% l9 r4 T5 S2 l! p5 G
#define PEI_CR(Record, TYPE, Field, Signature)   \( Z- Z# }7 P. M" v. J' k# \6 z
            _CR(Record, TYPE, Field)            
# _0 N: D/ h6 o, s' e, I: d! Y$ n, F# o4 b, n2 h. a9 `6 X
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \- i" e) A, b5 ]" V2 s! ]& Q
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
5 N  _8 w: s6 \" l/ |. [/ l: m9 c- C# m
void main(), o. F: B- ~9 g4 T! \4 i  h4 K4 G5 P+ |
{
! q- o& P6 W! ]3 S        PJANY        jany;; P' d! e8 l; i1 j4 C7 C! V8 {
        POWEN        owen;
; J+ [4 p+ P4 \# J2 J$ k3 X        jany = malloc(sizeof(JANY));
$ M; U! T8 m2 `% S0 X1 r/ G* i        owen = malloc(sizeof(OWEN));. n  Y5 {9 Z* f' O$ f& C
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
2 g8 g: Q$ G1 _" x) M: A        free(owen);
3 T6 j' \# u4 Q" m        free(jany);, V8 q0 y% f) G7 Q5 L$ p' n
        return;        - N: Z+ O! q. q8 Z: B% E
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。1 k3 Y+ `1 Y  g4 v& \
  Z" b  f& N& p1 F4 ~+ e5 K
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。* L: s# O" E2 s/ M2 {9 \, M8 O
谢谢 “kelvinklee” 指点。; ?$ {' S  H. C8 N
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
7 r% ?9 w9 X# S- H) q) @.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!9 S& F, q% t% T% m* M
输入:一个结构体成员的地址指针,该成员所在结构体的结构
/ m2 h% {3 M5 {/ @$ x  W输出:该成员所在结构体的地址指针
: j9 @6 }( j0 T3 J  k7 }  v
+ L. |! t5 T6 I算法:, a3 }5 t( F8 g" k" `9 a
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
/ {+ }/ |! g$ c4 k5 B/ L, G1 L2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-21 21:54 , Processed in 0.421914 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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