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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?6 N1 z  D0 M1 A* q
我调试发现他是取得那个字段的地址。
' z- n+ u' C- X  ~大侠能详细解释一下吗?
3 d+ R5 Z& k$ L% A
. B% F2 `# R! P9 i& V1 \+ z这段是我Debug的用例。
9 M0 Y. l+ _! v1 U& Y7 V3 ~' v& D
#include "stdio.h"( S  y( N* D: f8 [
#include "stdlib.h"
% ~% C' h: U. u0 l#include "string.h"1 ]& K$ z4 T# g

' ~  ~1 S" e1 g# N! _5 a* p#define        CHAR8                unsigned char" R4 V8 B7 ]6 Z; T0 o) p

" P, c- E5 w' r5 Q; {% ztypedef struct _tagjany
- _- Y( E. k3 f* v5 b{
7 c0 g% m, M- f1 }) O        char name[8];* N: E1 E6 [& T. K
        int  age;" z! G3 G# U2 T4 o7 p
}JANY, *PJANY;
% A8 P9 f& c, r0 |- U- l0 s6 ^
, ~4 c* K9 m0 q! c& }typedef struct _tagowen0 V: g, [  k( j( ^9 m6 S) V* x- y
{
$ P# c9 v+ @1 W$ T5 ?( H. V        JANY jy;; Y8 O1 {% T( E
        char home[5];  @, p! U( X5 b
}OWEN, *POWEN;
( N+ |- L. h. i" @; {+ H
. S) ~2 L( i  G! l; \( _#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"* F; f& v3 N( v6 F& Y! ~2 o  S5 }

- P3 L2 _8 `, n#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
) l7 A, `7 H# x9 B! v1 y& @* I/ \$ r+ S% L
#define PEI_CR(Record, TYPE, Field, Signature)   \. b( h, h  d+ w) |- j) B0 s1 U
            _CR(Record, TYPE, Field)             # @% }0 i! v8 ]( I- d# X

. ^' K* w! W$ M4 v7 d, d2 f% e#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
1 P7 l; i" ~/ ~. v  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))5 S$ s- y# L" }0 M/ n! M& S

3 Z1 T, T; U! g4 @( R4 tvoid main()
9 \" m$ q3 N# Z{
+ h- J9 ^' V! S1 S8 h  O        PJANY        jany;, p) j; `" L/ M# `
        POWEN        owen;
& l( @1 ]0 F. |& o9 Y  I1 s5 Z        jany = malloc(sizeof(JANY));
6 C9 h1 B/ P3 ?        owen = malloc(sizeof(OWEN));
/ s1 N  Y; w3 Z3 g0 @        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);5 P; h8 v2 \- ?4 C
        free(owen);
  S: Q  F0 k( F) X3 a        free(jany);; ?1 f) R' N& g
        return;       
/ w0 u, t8 g% |  ], n1 U}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。: q6 ^0 K( |7 g+ U

3 e, T7 S/ J3 L+ ]你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。- y$ ^, W8 u: C" k6 o8 V6 d
谢谢 “kelvinklee” 指点。
, ~% e/ t5 S4 M) p- Y0 x. F- h; rhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
3 m/ J3 S8 |. Z" U' x.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
, [4 y1 W  ^! R- e1 {输入:一个结构体成员的地址指针,该成员所在结构体的结构
. s. j% E# d3 g0 `' h输出:该成员所在结构体的地址指针
1 _$ G" D! H" {5 L8 Q3 h) @& r( I. Q) w2 X3 |- A
算法:, k! e3 A& _( P& s8 b
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量1 `& q$ G' R+ C8 M) v
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-7-20 22:25 , Processed in 0.179639 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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