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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
, D6 I6 Z! v/ a! u, _/ e我调试发现他是取得那个字段的地址。
% N5 a4 O* H! q/ ]% J; o. K大侠能详细解释一下吗?
9 M2 b+ j5 p+ \1 ^
+ S1 F! b& x1 C4 O5 K这段是我Debug的用例。
5 A6 f1 V6 e9 y1 N# X% d
. S' M: B5 W7 R; }2 }8 q#include "stdio.h"' s7 ?( n. P+ k" ]% h% V( @7 I+ I! p6 w
#include "stdlib.h"& n  `$ }3 O2 b" I0 O; ?
#include "string.h"* E, B4 A. q8 |
1 \: b% J3 K/ Q  }
#define        CHAR8                unsigned char
& n8 n, c% m- i  a+ _. [2 y7 G2 s6 q! r1 `
typedef struct _tagjany, S0 a+ h9 a) o& @0 k; k6 h& p
{. e  h& u7 ^* p4 k; Y: q
        char name[8];
4 {' ]- n$ [9 d) D- k        int  age;$ P. \$ [. E7 u
}JANY, *PJANY;% u. n8 y$ u3 {& ]6 F  ^

: c+ |9 ~, n) U+ _4 m2 Dtypedef struct _tagowen3 |+ O/ T9 c9 T) m5 t4 z: W4 D
{6 H4 z: r' ~) T* M; e* s
        JANY jy;/ |; G/ ]5 e$ L0 ^
        char home[5];" l0 q3 |. j# _4 J9 Y
}OWEN, *POWEN;5 y- K& B4 S! Y" r7 a+ j6 U' I
. R* M  w1 H# W. X
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
# H# S( n3 k3 t6 c( K* d! m" ]
0 \8 n0 E4 p$ S# Y; y#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
1 E3 I/ ?1 i4 d- o' k! ~) }6 Q: j1 A, ~1 b
#define PEI_CR(Record, TYPE, Field, Signature)   \! M. s/ o, E: Y8 H
            _CR(Record, TYPE, Field)            
* h7 {) n2 m- q1 n( V3 s- z8 k; S- }" e+ s& F$ x
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \' M- i+ T) {  q8 w0 P8 A
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
6 @; T* b, ~: \. [6 ^1 Z1 @
4 {  C2 f1 {, jvoid main(), }+ W" h+ u& S* ]/ B$ Y4 m
{
; j2 N6 o6 J* N# R  c& ^# i% u; D( D        PJANY        jany;1 e4 i0 V# m5 f' d, x* D
        POWEN        owen;4 _& v7 d! s* H& S: d' ^- ?6 R
        jany = malloc(sizeof(JANY));
) v7 ^. A; M9 N) b5 H, s- V        owen = malloc(sizeof(OWEN));
, x7 X% M9 N' a9 k        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
/ |9 l; @. T. A' P        free(owen);
7 n5 ]) T9 A) g        free(jany);# M2 c% A. K2 y2 H; x: l3 a
        return;        / t2 K1 i% O: _" D  L; [: d
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
  W  a+ s8 U  }& ]9 W; [- c: Y% b5 v8 k2 ]9 @5 Y2 w
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
7 T6 X1 v: t7 w* ~1 ]/ @& y谢谢 “kelvinklee” 指点。
4 R9 O, m/ `% |/ ?0 {: whttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                + G1 Q8 `) I0 M
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
9 m& I& g# L& `; {0 f输入:一个结构体成员的地址指针,该成员所在结构体的结构, y. U! @; [. ?* ^% D
输出:该成员所在结构体的地址指针" v6 M: }0 U) w5 r9 q# Y
+ v$ U% A' L. T
算法:: w! v2 b4 g/ y! \
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
" Y2 X& c6 S% X) [, G% T& ]2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 05:37 , Processed in 0.072550 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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