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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
3 @% ~. [& [& Y( z. I我调试发现他是取得那个字段的地址。1 a. y# R  R8 M6 d
大侠能详细解释一下吗?
, @: X3 Q, P6 `9 @4 O& d( R
8 \/ C0 t7 B; R) z' ]" l这段是我Debug的用例。+ X$ M  k8 t% Y- [& i. I) |$ D" r$ L

) s# x. C/ u$ j1 v, j( L2 {#include "stdio.h"* L* ]& m  s/ T1 n" J6 K' P; C' h
#include "stdlib.h"- a; C# L- [/ ~. `, R8 W/ ~
#include "string.h"  f8 t8 ]! p5 s& D, _7 T* }
5 n' v, @* ?% b6 o" |8 k
#define        CHAR8                unsigned char# R4 r) P% w, r" q# m
4 V2 Y" m9 j( `
typedef struct _tagjany0 l1 h& s, k, X0 H9 u/ D
{
. H) Q8 i; n5 Z- o; }        char name[8];
, p1 {4 z" v% e% y        int  age;
" ?7 Q" B  v  H& @: Y}JANY, *PJANY;
9 e5 _$ @8 t, C' T
# U' @) Q3 V- `# q: y6 `typedef struct _tagowen
4 F+ H% g/ S, q( @" O0 w4 c{
) \7 d) p( e# v/ o        JANY jy;
; u. W; R% `1 z5 d1 N" `* D        char home[5];
7 h/ j: |! I( x}OWEN, *POWEN;
$ C' O) t1 {: k! ?* J/ U
# G5 T$ L9 W. Z; s1 a, h#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
6 P3 n# G" E9 U3 m( n+ M$ h7 ~5 x% j
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))7 J9 Z+ F8 t# J& l5 l9 U, L
; p& U" V) y% [  Q& k: t) @
#define PEI_CR(Record, TYPE, Field, Signature)   \
' I! I& B2 K- t8 W. A& n+ I            _CR(Record, TYPE, Field)             0 m$ j8 I+ P' X1 l. U
" S7 I9 @3 O5 C8 c3 M( `. G
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
; Q$ i5 d; V$ Z* _# G  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
1 B1 k8 i3 K- g( V! }& J6 l- S
4 U3 g9 p; ^) ~6 g: Wvoid main()5 e( D( S. e) s
{
8 w2 c$ N  \9 R; Q9 ^! C; ]        PJANY        jany;5 ]2 E; Q4 }! E5 v/ i# h! M
        POWEN        owen;& R+ \3 y+ t: a( X+ w; E; @
        jany = malloc(sizeof(JANY));* N' e9 ?8 Z! `& s, M
        owen = malloc(sizeof(OWEN));8 t* C( K# ?" o, p/ r
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
5 z# B% w- i5 L3 l8 M3 F        free(owen);, G9 Y( C2 a3 S) J0 h, R
        free(jany);8 _: ]5 Q  `0 q0 F8 c
        return;        2 v, R4 S* ~& t  \
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
$ T# s% A7 G3 q7 z0 v6 A; G# \5 U- K) g# Z0 }
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
& P/ m8 I( k& w! r% j谢谢 “kelvinklee” 指点。
# d$ A- Y* [3 c5 }+ _6 K0 C3 @% phttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
9 R7 x+ C1 L1 H2 D' m9 w7 M.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!/ k8 I8 ^0 x2 z2 q$ \
输入:一个结构体成员的地址指针,该成员所在结构体的结构
& P5 i: ~( h; p7 w  J输出:该成员所在结构体的地址指针
& G! O* {) X% z/ v% }+ j1 D2 \1 |0 Z0 J/ a! v  e4 X2 M' `
算法:, H' |% |9 x" Y1 U0 f% H3 u
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量4 ]$ T! |4 y7 O0 f
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-12 06:26 , Processed in 0.026552 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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