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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
) W* ?) d- h6 Z" Q我调试发现他是取得那个字段的地址。- h* [- L9 j. I
大侠能详细解释一下吗?- v+ C  D2 T% D5 X/ X% M( Y9 O
2 O. M0 s( _& }9 J
这段是我Debug的用例。
; U) A6 o8 v* x3 h+ w' v- c$ [9 \& x- B
#include "stdio.h", J% X0 p/ [, [1 w8 \8 X
#include "stdlib.h"
3 @5 ?( K. I/ O% z#include "string.h"( `2 ~! V- I6 p2 ^0 f
8 E' w) U7 D* V  b; I& R7 P
#define        CHAR8                unsigned char
; l( S0 w7 t9 {2 ?
* l, h! n% h1 j9 Rtypedef struct _tagjany
1 \/ g' [; f6 y1 h{# M; {0 o: J" r( G& g2 p7 x# U9 {
        char name[8];( ^& |3 z7 S* C, m$ e
        int  age;  y+ t% T. y1 @3 y2 C, }. X
}JANY, *PJANY;! r$ m4 ?  w# t1 K: ?9 k

9 ^# D) z1 u$ y0 \typedef struct _tagowen
" h- X( A5 T1 l: ?" M: v# j3 w{
- V; g' y1 @3 _& w% c5 X/ w1 G        JANY jy;  k7 U% v; `7 x
        char home[5];
6 V$ h" \6 D$ W, p% C5 e}OWEN, *POWEN;
  ]8 b) H% h  V* Z, {" n% `( E" q; c/ t' N& [6 Y
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
- K' E) N  q- \; Y# X9 G  a. |  ^1 V7 y/ a, C' x1 N
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))2 K) p' y6 w. U3 B

! V8 C1 M0 M- Y; m7 C: ~#define PEI_CR(Record, TYPE, Field, Signature)   \
" W6 {( {4 N- T1 R3 x            _CR(Record, TYPE, Field)            
' ~% ~- G# i$ X) J: D7 y( W( |9 A/ P5 d; M% h7 d
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \2 D2 u) H& l- M6 v. s
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
9 v9 T7 b" d" ]0 G+ y6 O- U4 |/ g' _" C) \7 F4 T* ^
void main()7 k: `# ?' ^( ~  t& I6 y
{2 X+ ]2 X" M  Q6 c- i
        PJANY        jany;
5 `1 L0 @7 [) \, y        POWEN        owen;1 X, S' w6 t6 j5 |9 n- W
        jany = malloc(sizeof(JANY));
; Y- t# N! O+ [9 G6 w6 a/ N        owen = malloc(sizeof(OWEN));8 t* s! v# {! G, V
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);% b6 o: {' D* R) n$ n0 s# x" Y) A
        free(owen);+ x2 ^# C$ i+ Q/ I+ l! F
        free(jany);
# Z, O9 m5 N9 w: J9 A+ R  r/ m! L        return;        & d! Q3 w8 K$ |  u) I
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
9 H5 u$ i7 _: g& x3 K5 j9 w6 R( W$ n! s" N
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。9 S" C. h/ ?; @; |/ x
谢谢 “kelvinklee” 指点。
; h) j, m: R% S! k' Jhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
5 r5 O$ q, q3 `2 d.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!( Y% F; I# m% W
输入:一个结构体成员的地址指针,该成员所在结构体的结构8 |/ j* Y, {4 g7 Z1 @2 C
输出:该成员所在结构体的地址指针
! t. e8 {' ?' V" T$ C1 ]* q' \% y. x# a  @$ F5 ?
算法:/ h, O, H) T* S9 `0 f+ f5 x
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量5 \5 D% ]0 r% ^3 [# O3 ?$ }
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-25 20:07 , Processed in 0.640830 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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