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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?% q& K( x: ~7 c: K; X
我调试发现他是取得那个字段的地址。
7 K5 [/ s0 h+ R! l% k大侠能详细解释一下吗?1 N! m' z- `& J+ M

2 p% K( S6 E# V) k5 Y" S这段是我Debug的用例。6 D* t$ e8 I! m' _9 G* A

* Q& S8 o% M; d' Q8 S#include "stdio.h"
4 l( w1 W3 \- q: E) Y5 _#include "stdlib.h"
9 k' O: Y0 G0 W! l#include "string.h"% M; J# d/ o$ m. N  P6 n

- Y7 w! @$ A2 Y; k9 Q# x8 u' K#define        CHAR8                unsigned char/ W6 O  _# N4 X4 z0 i( M$ t/ Z" f
! Y+ _' P2 ^, d2 ]6 d) H0 t: o/ x
typedef struct _tagjany+ M$ ?# b* U/ k" s. E, C
{
% x! P* Z/ R( B5 h4 C+ a        char name[8];
3 k2 D( I" Q% p7 M/ ^  }. N: V# y) t" d        int  age;5 |2 H- u% v+ u# M% c2 K  k
}JANY, *PJANY;
+ I. N6 q  i- _* Y" }1 s' `# z* k
typedef struct _tagowen$ L! ^( w3 n; x
{
. G; G& L/ `# `! i3 h8 t3 @        JANY jy;
3 h3 K5 [- o5 ?* ^: l2 s        char home[5];
" _7 a7 w6 e+ X- Y4 [# F5 i( O}OWEN, *POWEN;( \7 ^- c! w0 [$ v% m
, x6 f9 P7 u7 i+ u  L
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"$ a3 |; f8 N) D! G$ `) @
4 [6 X& b' Y. N" l* ^+ ~* |7 n
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))& q+ S0 |/ ?" G" r) i9 q

! X! c3 q5 t* J' {* T  w#define PEI_CR(Record, TYPE, Field, Signature)   \
% O, B3 s, A$ W9 w7 t& G( v% C            _CR(Record, TYPE, Field)            
) w2 h$ r6 P4 p6 v' ]6 G+ V
/ g# @7 A, ~* h$ I, ~  Q5 j#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \8 {$ d* F5 Y9 v( e
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE)): ]3 n+ ~6 B$ `( ~

( G! n( \# Q) |8 e; ]void main()
% i" D9 Z& R- ?7 e3 h{
, q* a- ^+ N+ j4 b9 D$ \) N        PJANY        jany;8 w) E, P; m1 A2 ?9 h* O( s
        POWEN        owen;! [. F5 b! ]( o
        jany = malloc(sizeof(JANY));
+ M, F( a# m# w; @; N& \        owen = malloc(sizeof(OWEN));- q+ B+ z0 I; ~! Z- s: U
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);( o, Y3 v' G, t* D1 C) G  y0 B
        free(owen);/ \: |, X2 E( W5 s" D
        free(jany);
4 `$ e" S4 G; e# \+ s3 ~6 K        return;        . _% T' q1 h9 S% d& T* Z
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。& N! Y, g' ]% w2 K. s, `# g

9 r. t  L  g$ x* \! Y你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
/ _9 T0 {7 a! I谢谢 “kelvinklee” 指点。! o6 O* [! N- D8 Z3 t
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
1 k* S$ F* U9 x: g+ r5 y/ i0 \.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!) P6 x5 y8 H; U' }+ z7 \
输入:一个结构体成员的地址指针,该成员所在结构体的结构7 [1 [( t1 ?  d8 U2 V' u0 r
输出:该成员所在结构体的地址指针. S$ d' O- \; Q3 B3 u8 _  R

6 m0 F1 w9 L6 b! o, f算法:
6 \7 g+ T: o) A& @% ~2 M% H1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量9 h! S' d  O* p: W$ j7 V4 _9 r
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-29 04:08 , Processed in 0.390102 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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