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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
1 n( I0 b% Q2 g' H/ J. [我调试发现他是取得那个字段的地址。
5 l% ]; A; d. S' I9 Q# b, }: c: U大侠能详细解释一下吗?
9 C; J4 u$ V7 v
7 @) K) n: |5 o  S, I这段是我Debug的用例。# p2 \2 v3 H3 N3 C+ W0 {

; ^2 Y0 [; e4 @, |! g#include "stdio.h"
; g* l9 N) w! Z+ G9 j#include "stdlib.h"9 @+ I" p: |! y0 y. Z/ [0 R
#include "string.h"
0 f8 }" ~4 N5 B$ t0 `% A! ~4 r& T' Z5 f. |4 }
#define        CHAR8                unsigned char
/ N& @# ~% _0 a+ B2 [9 Q/ \& E0 C0 X- s$ ?" x
typedef struct _tagjany
1 s, {: Q7 o5 z1 F; u* x  S{* j3 p+ p2 w! h! T; e
        char name[8];4 K9 T/ m' U+ ?
        int  age;
; ~' U2 y& ?; c" I1 A3 d}JANY, *PJANY;
6 Y6 ^& [+ l/ I+ ~$ A( f+ q: w6 d6 A
3 r+ a- r/ m1 t8 j# A$ I5 Vtypedef struct _tagowen/ }# a( ~1 b4 O0 s* O' O4 t2 i/ K) y
{
$ [/ W& C) {$ s- ^" O8 Z6 l        JANY jy;
. B2 \* F- {% D3 u1 H        char home[5];
, B- M2 q+ z' N& R+ S}OWEN, *POWEN;
7 }+ l- G$ ?5 Q" r8 l, D0 E. [- i- ?; g" ^2 g0 Q
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"' T+ \6 |! C4 X+ H. B0 `
0 s7 e4 z7 n/ y; C& w* J
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))8 ~; R/ [3 K, d

; m$ B1 X8 w, X, y! ?( L#define PEI_CR(Record, TYPE, Field, Signature)   \4 J( m0 g. K* G
            _CR(Record, TYPE, Field)             ) D7 q# r- C9 p4 u, e
  r; B+ `6 u. A$ m
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
! e( |  h. i9 c, X# e" V5 E8 C  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
+ t) g, U7 A5 ?/ w3 p) t4 }# g( c1 z3 ?: t
void main()8 g! T8 Z4 s( S+ f3 Y5 y, q7 T2 k
{; e" f* u' f! j- i, Y0 P3 P
        PJANY        jany;
$ g6 ]# v5 S# F7 K9 Y        POWEN        owen;
# [2 \  L# P5 [$ e        jany = malloc(sizeof(JANY));9 b' y+ G! C2 b4 S. R) K4 d
        owen = malloc(sizeof(OWEN));
3 J! i! g) R& W0 ^* O4 t        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
5 f3 v. I. E1 H" O# p        free(owen);
3 _/ `6 V0 R4 l: n# R# `; H        free(jany);
: _: @$ y8 z9 R7 U0 a        return;       
( m6 ^/ _& \; H1 S7 k  X}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
' h8 y1 [+ n5 i; d: L* R' h
( v4 B2 j  i: [$ s, [5 u你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。+ X/ g) b% ], o! D; O8 e4 c4 [- w& ~
谢谢 “kelvinklee” 指点。! ?+ e- g; @" e# M0 g( I
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
' {  d" M8 h2 W: U; [$ d/ U- D.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
+ Z4 y" H  G/ x& k; I7 F输入:一个结构体成员的地址指针,该成员所在结构体的结构
% y7 S- T9 i6 A6 T- P( }8 D, U输出:该成员所在结构体的地址指针
8 v0 G; v5 `2 J+ i8 b. `, Y) E
" G: D/ D4 o5 d9 d: C算法:
: ~+ {/ {9 v; M# n/ }1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量; x, K5 F2 x" _0 j6 N" J
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-4 20:38 , Processed in 1.419847 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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