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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
2 \" z) l5 u9 F' `% ^我调试发现他是取得那个字段的地址。' N5 n4 z) T- F! A1 I
大侠能详细解释一下吗?7 p6 h- s" e$ K1 b! S3 [; j

: |+ b7 \9 Y( q1 M2 l这段是我Debug的用例。. h& z. S. |0 e! V+ o& n  p

9 J5 t. w; H/ [  a( b6 y5 U  o#include "stdio.h"( F: D( s$ Y) b1 g! U: W/ ~
#include "stdlib.h"
- Z( c1 v# t7 G! e/ O#include "string.h"2 ~3 }7 ]$ n: L& M

- o$ Z) v$ [( Z) ^; h; M#define        CHAR8                unsigned char
5 ]3 {7 Q/ d2 z( t( W  T( ]+ z9 J$ w/ b$ R1 G3 D1 I" C
typedef struct _tagjany
% N9 @5 _& E* f9 r( P/ H{! k" S9 D1 I- ?7 E
        char name[8];' Z: d2 r; A3 x# B; _8 f
        int  age;
# s& }7 q3 r" q: Q6 S}JANY, *PJANY;  ~* q+ E" _% s6 K" }
, x( ~/ y+ m% B; j8 X1 l6 m
typedef struct _tagowen
( o  ?9 m1 B" [7 C9 O& n, b5 ?$ W# t{6 p3 i; `5 x9 M2 u9 Z
        JANY jy;; `- \8 W1 }: s/ r6 r1 o& n
        char home[5];
% F  x# R( F& V( u: C}OWEN, *POWEN;
' K% s$ \! \. t; e6 m$ i7 N- M7 `. o  u
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"8 g8 @9 K! y; O* j3 c7 v$ H9 q

: a3 _8 O8 @2 S6 b! W! H0 s#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
* A+ @8 P6 h  c
4 ~6 ]! H) E9 s) j#define PEI_CR(Record, TYPE, Field, Signature)   \2 U4 r4 ?) y/ J. X! k4 x
            _CR(Record, TYPE, Field)             ( c" e( T! k5 k" c+ c
( Z: Y5 U4 |$ C2 o1 L# L
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \8 p; }) N' W$ C: ^
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))% y0 T/ z1 @/ H9 ]; {
- K( U- {. v8 E8 t8 u; ^5 `
void main()
/ u$ o0 |% q! S) U4 N3 K{) U# K' E& C+ x1 l2 }
        PJANY        jany;
: j6 }5 p' e3 `1 a3 j        POWEN        owen;
# d- ?. M- L6 t# Q$ X4 R0 F        jany = malloc(sizeof(JANY));
0 H) G% w, _" n$ g" W+ w        owen = malloc(sizeof(OWEN));
4 c0 R& O' H- [/ _        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
- Z& f- R/ S1 y1 U8 w9 J        free(owen);9 T/ X+ P' o* w) q
        free(jany);
3 Y4 q7 I* U. [2 [' N        return;       
/ j. f% r0 ^3 b}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
7 q) V  `; \+ u; Q, X3 O5 h, s9 a7 E  f2 S
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
6 J+ Y  ]: A+ A( ]  V6 {% |* y1 p( T5 B谢谢 “kelvinklee” 指点。
: d5 p' {7 f+ Z- X! B, o' jhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
" R7 e3 U5 k3 h.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!8 {$ X6 y! z( t, U2 o: y
输入:一个结构体成员的地址指针,该成员所在结构体的结构# M/ i6 \( Q9 A2 f- c
输出:该成员所在结构体的地址指针; I, _4 n; @$ t6 G% }
1 O. d# }7 g  n! T
算法:
7 _. [2 q" [2 {( e1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量4 s6 e6 ~% S4 n5 H! j
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 12:03 , Processed in 0.024596 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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