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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
0 V. r) ^# w( j. a, f- p我调试发现他是取得那个字段的地址。5 O" Y" ?, [9 l
大侠能详细解释一下吗?
# U$ h, i9 Y" ^  \. p0 e
3 J3 R% K2 I; t3 I这段是我Debug的用例。, o+ V8 j! N- n  M. ]

) Z4 A& l  Q# c8 T3 S& }#include "stdio.h"
4 D' ]( W! C0 F$ j#include "stdlib.h"
9 K5 ~& g/ k7 S, H#include "string.h"
3 ~/ F8 |2 k4 A' Q/ L$ T% g
5 k# v. D4 o- p  s#define        CHAR8                unsigned char
0 _& U2 I5 I( ]! R, u' `4 K; C
! k' n8 K9 k+ S$ Y- m. Jtypedef struct _tagjany
% n! V8 ]. }; |! _( ]$ o{
8 D1 Q: D: ?; E& ?  @$ Q        char name[8];- Q# O5 s; T6 [( \
        int  age;/ u5 u+ K5 K7 p" O) H
}JANY, *PJANY;
9 Q8 c  r( O) V7 U- S" J4 n. C9 W+ U4 ]0 C+ ]6 w
typedef struct _tagowen  k$ j' H! \- X( ^! ]: F5 g
{
$ _3 P; |% G) Q$ i0 b7 ?7 X7 z) T/ t        JANY jy;
1 V# Z( s# I- ]$ U, I        char home[5];
7 ]) h4 p$ n3 [# J' u5 Z}OWEN, *POWEN;
4 U* D$ G; r8 H! j5 w# l2 ]  f: i2 f, t# @2 y+ d% R( ~
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"9 w' }/ D3 B3 {
% I- L) R' g5 T* O' T) z
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))$ Y; y. k0 c+ W7 l6 W6 k# I
. F/ \! Z4 o- G  I1 Q* _2 T
#define PEI_CR(Record, TYPE, Field, Signature)   \
* ?" q4 M; C; i. g3 o/ a* {            _CR(Record, TYPE, Field)            
0 e5 `+ f2 Q5 T' `0 v' o  e+ ]! I" E9 E
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \5 C7 s2 c+ t5 {' }$ t9 T
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
+ }5 f3 i/ X4 ~  x$ C. E% M6 e0 o, y
1 G. m4 U! s0 t6 |2 A$ _void main()
# C% C5 X" Q; Y: z- [4 v{  P$ O9 W: L/ `* N& z2 z, h7 F
        PJANY        jany;
- `6 x7 v4 L3 l$ A        POWEN        owen;
" _8 I. e5 W( z: g3 Y        jany = malloc(sizeof(JANY));1 x  V: {4 f6 K) f* [8 R
        owen = malloc(sizeof(OWEN));
3 l7 ?0 w+ E# ]        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
# T, l) O* K8 q2 s  e        free(owen);
8 B; {2 |0 i7 H        free(jany);' A5 C% l( L/ S
        return;        " m9 i' p% {' v
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。/ t* z' |4 F* Y& v
/ y# J: i, @9 t
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

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

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                - ^: @: O( `  V: d3 Q3 T. a! }. c
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!8 _8 g: O/ i4 G" V1 p
输入:一个结构体成员的地址指针,该成员所在结构体的结构4 ~  v/ M0 ]( m& @+ A0 r
输出:该成员所在结构体的地址指针
1 `# S9 z* ^+ m2 E9 P3 v7 r7 U! [$ N/ w& r+ ~3 V* v
算法:
2 F! v; g: q/ q5 N3 o' O1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量. N2 f, c* ?, G1 p( J7 I( m
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-11-3 23:07 , Processed in 0.118310 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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