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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
: G; k/ W0 K$ ?$ Y% `4 s我调试发现他是取得那个字段的地址。
0 y9 s9 e0 b( V7 d大侠能详细解释一下吗?0 c: [$ m2 V/ z0 A* w8 w* ?; e$ Z8 C

# g4 V" Z" L" R! ]0 A2 l这段是我Debug的用例。* V2 R$ e+ E* B+ {5 e" T2 }5 Y
. b+ A" O! M6 M. ?4 t. q7 P
#include "stdio.h"" q" D' Z7 s) P" a) G
#include "stdlib.h"8 \) o3 A3 I% |
#include "string.h"
' S" }( ?8 p( R7 J
+ B) I% `2 }$ Z  @$ P0 {#define        CHAR8                unsigned char+ u+ H: C# B. K2 Q+ f

" z7 n2 D0 B8 H+ V6 |typedef struct _tagjany
* m% F& @9 S$ d5 z, G{. a7 M( Z) f4 I1 Z4 \4 z
        char name[8];
; |2 g7 |) L* ?- Z3 E1 u! ^        int  age;2 W0 ]' X2 J& a6 ?; S7 m
}JANY, *PJANY;3 r* f, q6 h  ~5 ]3 J
! }6 G8 ~) p' t4 n6 ]0 n
typedef struct _tagowen
6 Z! a' E- J9 [3 y, E{
- W* P3 M# F; h0 ^        JANY jy;
  W0 z5 K  y' |/ E        char home[5];
4 [( b0 k0 v) U% ^2 H}OWEN, *POWEN;: Q9 v! {/ l5 d6 d1 D4 }, F/ [; p# `

% C) ~" p  L  I# w#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"6 @  I$ e# L2 w3 D9 F, m7 g
" ?, ~( P+ N- w( F1 X3 Y4 E
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
  P* q# |) H% @# c0 k* l6 m6 y. D% ?! {
#define PEI_CR(Record, TYPE, Field, Signature)   \/ H. K# k: E# \( ]) m* V5 ]% J) h3 E
            _CR(Record, TYPE, Field)             4 g9 k- b: N' Y6 g3 K

5 }$ r1 n: E) y#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \. p; f. t7 k2 p  {& e5 A, n6 f
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))1 q5 }& l, Z. P9 ~1 w6 O
) L5 p4 n# y: v6 R3 ^; W
void main()0 x- A1 v/ U; f: Z: t
{
" n/ O: g1 K5 S; J. h; d$ c$ S: w! H# F4 x        PJANY        jany;
# f" b5 [2 _) k: f( ^' y. l& ?        POWEN        owen;8 H6 r: p0 _, f% i
        jany = malloc(sizeof(JANY));
6 T. X6 o0 Q3 L        owen = malloc(sizeof(OWEN));( _& H7 R; Q3 d& y+ t
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);) z4 \! x# \9 {6 b- A4 |1 E
        free(owen);) i0 C$ c' k- j+ x4 t! G4 _6 a' ?( [
        free(jany);
  y" b- i5 _# _, b! }        return;        7 e( x, O  `( O* p1 H
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。: [; Y( H9 \. h2 {' A% V* Q+ p
/ ]6 f) Z& o+ L2 [
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。4 s4 Y, F1 h( f( Q2 W
谢谢 “kelvinklee” 指点。
4 Q7 r) i( Z1 A3 y' T4 W% Vhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                $ X" M8 O8 C( I8 Z& j. i8 \
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!: f' v, x! r" I8 |) y0 H& R3 t7 ?$ r
输入:一个结构体成员的地址指针,该成员所在结构体的结构
7 l! z8 o8 j  h1 m6 z2 H输出:该成员所在结构体的地址指针7 y$ I4 W/ v9 E" Q2 o! E/ ^1 q: |# ^
  m4 ]3 @7 n; ^8 b9 c8 v
算法:
/ T0 |6 e+ O8 S4 a0 W1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
# S0 N' {) ?. I7 }6 v; d2 Y2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-18 22:45 , Processed in 0.057649 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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