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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
3 ]( [: z8 R  t* ~2 z我调试发现他是取得那个字段的地址。
; v0 f7 W% u1 u, {! E# K. I大侠能详细解释一下吗?" I) ^" ]; C7 B" [# w0 R* l7 w

2 \. i# h6 Y/ t' S  ?这段是我Debug的用例。) P( B* P/ r/ R
; K1 \6 Z  ]( o' ^3 X$ a8 i2 l5 z3 w$ `
#include "stdio.h"
* C/ e+ D% D( X; ~9 l#include "stdlib.h"$ m. ?1 M8 ]6 M$ e
#include "string.h"
6 P6 P; ?* F( P2 F  ^2 b  O- q4 l0 H% D, n4 l. A
#define        CHAR8                unsigned char  P9 J' {6 g* H# Q& w9 j

' i: x& p9 O4 O/ l1 ftypedef struct _tagjany; M3 d: C# ~/ A# _! q* R5 |
{; Q/ T% W/ N$ @- D+ _. B8 ]/ F$ q' o
        char name[8];
: X. w/ O; d) O& S6 h6 j        int  age;. k5 N7 ~$ J& H
}JANY, *PJANY;* p2 ^. h1 F5 w# L
7 @- A; R# u+ ?2 r6 S7 ]
typedef struct _tagowen
( c7 ^* B& L2 a: a{
1 z7 L/ c- `. p' g  z        JANY jy;
3 |9 M  U& p7 v! v1 L1 m1 C        char home[5];
, k2 y3 c3 R4 }8 A* A$ }}OWEN, *POWEN;
9 W7 }. ~( I# U4 ?
7 H0 V$ c( I. H$ e6 Z) s5 f3 `* v1 G#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"+ {0 C3 f0 w' r) T
# M6 z" ?! Y* Z6 S. x: z  [$ s
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))4 u" C% c1 \8 f. |2 Y8 l7 H# U

" X9 z* u6 x- L* i# n" n' R: c#define PEI_CR(Record, TYPE, Field, Signature)   \5 s+ `  u' P1 B! f
            _CR(Record, TYPE, Field)             8 J& N  G9 K) t( g9 C2 k
1 y3 r5 j; h( {( q
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \( S* T! d# Q7 y
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
% L6 }3 ^& x. z7 @7 B$ m. t: L: D4 ~% N5 W' l
void main(), y/ r$ Q$ \: \
{
2 m2 j# [  m1 c        PJANY        jany;
  v* m- A+ V+ Z1 c" f        POWEN        owen;
! I  C$ {* n1 W: J, K- I- U0 [/ \- `        jany = malloc(sizeof(JANY));# v: a  _: v4 t
        owen = malloc(sizeof(OWEN));2 g( u: q( L$ Y, S$ Z0 [
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);$ |' f; W3 \9 X7 H$ |8 n4 J
        free(owen);9 W. v1 t- |. {$ i, y$ k. v5 D
        free(jany);' T, K$ C/ `8 {6 v3 V3 J
        return;       
" e9 X5 c; e1 u2 l! M, o$ i}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
: }6 L" I1 y, b
: @, f+ ~8 O4 v+ X/ F8 B" V你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。5 c7 B' b5 M: G+ b, {
谢谢 “kelvinklee” 指点。2 H3 u/ a, t# T7 ~, L
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
+ R2 l( L+ ?0 c$ ^7 E: P9 A.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
8 U; j1 A4 Y# ?( a0 k$ U4 f8 `输入:一个结构体成员的地址指针,该成员所在结构体的结构
/ W4 B, u- M0 O. B) t8 P输出:该成员所在结构体的地址指针# t( ~9 w& ^* w) |6 j0 t

" w* }( m3 ?% d0 R3 k& `8 c. z4 J3 L算法:# e+ o* O1 ~* ?! W. R7 P
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
) K( l, i  k; [! W8 \- i2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-18 20:09 , Processed in 0.344066 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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