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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
8 U# l- b1 E' q% H- q9 M我调试发现他是取得那个字段的地址。! `9 _& M; C( E  K$ \
大侠能详细解释一下吗?
9 ?' F8 `4 h. N
( h/ ^4 b- n# j5 M2 @  [! b( ]; x这段是我Debug的用例。
1 H. d5 ~7 q! ^/ X1 |0 F! N2 V( i  |4 J: S" K+ }' j
#include "stdio.h"
; \. H- s0 J7 ]4 J2 N/ A0 W% f#include "stdlib.h"
. r. h$ k$ E3 w5 N# @- f#include "string.h"
/ ^1 B5 }$ \7 M. U* D! y# i) l" Y8 F2 h0 Y3 o  E
#define        CHAR8                unsigned char+ ^. P) I$ N6 R$ U; R8 E1 p5 e6 p

% t; g' `8 L. [9 h; rtypedef struct _tagjany
3 h  M( ?8 Z0 H! a{
  y1 Q5 c. I6 Y) d6 P) x7 l        char name[8];
; ^  [1 q% J/ C7 e8 H, O        int  age;
& Z8 i  g) J7 I9 {1 H  ]}JANY, *PJANY;
8 T2 w0 E9 N$ d% x0 n& i8 E$ F1 g6 I# q+ @* j5 U8 ?* \
typedef struct _tagowen3 Y& V$ [1 k# {3 C' |) @
{8 C# a- s' ?( M9 D" g0 J7 H+ [9 v. [& F
        JANY jy;! r$ H" |) L, I5 y& `: O+ e2 R
        char home[5];! g9 T& h9 H3 N/ w
}OWEN, *POWEN;$ ?# W4 X$ Y3 c9 z0 v& l
) D5 N  d+ \5 j# d# X! t) u
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
" O- W0 q& x' I0 a0 `: C
1 h7 {3 @9 `0 v1 L! N- c#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))( R2 _* W4 T6 S$ t- B" f
. V1 X# x0 }( ]2 b3 r* j
#define PEI_CR(Record, TYPE, Field, Signature)   \
+ f/ @* ~9 v2 _# C. B4 s7 \            _CR(Record, TYPE, Field)            
, E& c! G& W% V& m2 B6 r7 G: _
4 k# e7 Y4 f: i3 H#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
0 y. X% b4 m$ c9 d% i. a8 R  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))4 ?! d$ V' V! t
  A& v9 j( t" ?
void main()
# t, Z' y" a8 v9 K{8 N( }* d; k9 e! @1 s, U. L& H- K
        PJANY        jany;
9 S: y( r+ w5 L        POWEN        owen;# ]8 @6 \7 ^- T2 @: g  G
        jany = malloc(sizeof(JANY));
2 ^. ^2 v4 m. Y5 C- {# D: R$ ]: K$ w        owen = malloc(sizeof(OWEN));
. z2 b" _* [9 ~  Y& }$ R& L        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
# I# i' A* A/ u        free(owen);1 ~- j( T: R; x( l5 I/ P3 t
        free(jany);
3 O. L" m4 n; r+ a# j* W" _        return;        3 v, R" C8 Q, A
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。2 a' d4 y1 I  Y* J+ F' k: u7 G
0 ?0 X6 x9 Z4 n6 ]- y+ p
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
, S* H/ Z' B+ B6 o0 T, ^  M谢谢 “kelvinklee” 指点。! v+ y: X9 V: ]: h; v  t5 S5 h
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                ' z8 K3 D) @" Y6 g- T
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
! r. `  o! m% y- `% J) }' N6 P0 ?9 b输入:一个结构体成员的地址指针,该成员所在结构体的结构( n+ |  I' R; c  c% \
输出:该成员所在结构体的地址指针
" x% K: d$ E% J( j" y4 {7 h: F9 w; V3 c0 K7 m
算法:5 x  U$ x$ @& n; [& @) a
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量) _  n1 _3 y$ @+ [( J$ v
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 18:18 , Processed in 0.082512 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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