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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?# K$ ^) G$ J! L$ n3 B( q8 H6 t
我调试发现他是取得那个字段的地址。
. e  _7 Y! o0 T# V, I$ w! @大侠能详细解释一下吗?
* y5 i* ^1 N- ~
! z1 p  ]8 Y3 _4 c, Q这段是我Debug的用例。4 m  ^# Q' \5 M" Y( r) M7 r1 |5 t

4 V; T5 T( x2 A; O* o#include "stdio.h"
( w) I: S: Z0 C, U#include "stdlib.h"
, f( |3 ?* m, K#include "string.h"3 p* s+ \' }. u2 o" l

+ ]6 N6 j5 Y( l2 I2 P; l) P#define        CHAR8                unsigned char
1 Z6 h6 E# _6 c# B* `" o, K, \) I) g/ R  k* ~4 f$ U: [- `
typedef struct _tagjany
' B4 [. Y: y+ h+ I% c) O{
8 c% q) [, m4 N& B        char name[8];
( a* g4 [  k  W+ A# G        int  age;% R7 S6 v0 ^! h
}JANY, *PJANY;
# \4 v2 U3 d4 W$ w8 f9 q/ R1 T0 j
typedef struct _tagowen/ Q" y  E0 a: e. i' C+ F# Y/ P
{# [1 E) g: H. Q1 q+ F2 O" b- \' S
        JANY jy;
* q/ u# P; g  q) j7 o        char home[5];$ Q, A& O$ r& k$ d0 s! \" L8 {
}OWEN, *POWEN;
$ K% y) u  f: F& @
% n1 m" W5 `: Y  p; T4 Z: |#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"  o( n& ]. }8 b& t! X

, f% O: m: r8 G9 a4 I* e#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
6 n  `9 C. a" f* W; n) C+ C' d4 I. q+ P% k% s% z
#define PEI_CR(Record, TYPE, Field, Signature)   \* T. F/ b. u$ T( Q% K- |5 s
            _CR(Record, TYPE, Field)            
2 W9 {( E: H+ p0 K# W7 B+ s1 a& d2 T2 q! q- X
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
4 R8 l: k+ I1 z9 e  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))) f0 c: B# s3 ?5 r; J! a6 i$ [
9 w3 E# d/ [/ f0 r; D
void main()$ ^9 @2 W6 E( e3 X8 G) x5 k
{
' l6 A' Q" C1 p2 N        PJANY        jany;4 s/ K2 W- c4 A, b
        POWEN        owen;! G4 y5 N9 B" u2 |# k9 i& o! Z9 ?/ S  ~
        jany = malloc(sizeof(JANY));2 z+ O6 v- {9 g, w- _; Z
        owen = malloc(sizeof(OWEN));
. i3 T& k/ _1 l( O# ^) W        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
, a. [* N- S1 f- p; R        free(owen);
! h- y1 @7 v: x        free(jany);( O9 w1 D0 e; n7 G
        return;       
. t1 @7 ^0 }$ j( l8 L# g' c}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
: D/ _" [- N+ ~. m* _
# Y3 n9 P- z& @你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
7 G, u- P: Y! u: j4 y8 K谢谢 “kelvinklee” 指点。
8 F% a5 A8 h0 D4 b1 _1 yhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
& t/ d7 \7 G: j2 r8 C.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!% Y  y& s* J- Y- H
输入:一个结构体成员的地址指针,该成员所在结构体的结构
/ q, M. q, A+ x6 k+ D# Y+ {输出:该成员所在结构体的地址指针
- V/ r/ _1 v/ \: T. P0 W
& y: P! T  P1 B6 W) a5 ~3 f算法:- P9 I! b0 g" \$ Y0 ^' H' ^
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量3 @$ k: ]8 l) h6 K
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 06:29 , Processed in 0.019281 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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