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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?$ O+ S6 m/ Z8 Z. [' v
我调试发现他是取得那个字段的地址。
* T3 g0 }8 k1 g/ n大侠能详细解释一下吗?
6 _# f7 T; t( y/ i% W( e: t1 I% _  H/ T4 i6 ~9 d
这段是我Debug的用例。
1 N. J( o* f3 M0 ]: p/ x1 N1 ?6 P$ J) `8 J* A  A
#include "stdio.h"; e6 U4 a$ ^5 B+ H
#include "stdlib.h"' V! R& C( b3 B2 U, M' I+ {
#include "string.h"
% Z$ R/ I- `* q! f
, Q* ~& L0 B9 I* ?#define        CHAR8                unsigned char+ D0 [* }/ F( q0 N( d9 B% Y! Y

/ [0 ^' |) O! K1 S. z8 ttypedef struct _tagjany
" Q( P, G2 V9 Z- l. l{" M) N# R. v+ `# K) M7 g$ w
        char name[8];
, _. G& j$ h  L* _- Z! A$ e% a% J        int  age;
7 H* R$ n) X0 {}JANY, *PJANY;
# |1 {$ H& T1 J( K) }+ Q& Q
; H+ _7 D+ i- wtypedef struct _tagowen
7 H, i% H9 U) J/ f' i5 d{1 b! A. i8 U% m
        JANY jy;
6 Z( A: V( R/ o        char home[5];$ F0 v, y9 h; w9 n" j9 s, i; @
}OWEN, *POWEN;
" s3 `+ `6 }7 a
. C/ c1 W* m3 ~# q' H" o% L; ]#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
; c/ O6 H  ^2 R; i
+ R) D2 W- g0 s% x' e#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
0 J  @; C7 K  f6 x
- \% `3 H+ p3 F9 E#define PEI_CR(Record, TYPE, Field, Signature)   \
# w; S; B, {/ I; v# p3 K8 Z  ]            _CR(Record, TYPE, Field)             & u2 S+ q% B; T0 K9 {! q

5 J$ U% J, d, Y8 J7 m+ ]+ w* x" O#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
5 x" K- p" J$ n, k, u1 F0 ~  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
0 ^* O( J9 W, v, a& R9 n' J
/ p* t" R( t* }# S, vvoid main()4 z" g2 U6 n; m0 v( b6 F
{
1 `& {3 d7 m# C        PJANY        jany;
3 D$ w: }* Z: P/ y        POWEN        owen;
0 }8 d7 }) j9 }1 w5 G        jany = malloc(sizeof(JANY));, d. t& \% u2 M- w  a, w8 K
        owen = malloc(sizeof(OWEN));
' o# ]8 O* q2 I# w, c        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);; m/ V. l1 C- w  N" m
        free(owen);; d/ P' Y3 r; w  ~& a9 H! ^* {: y
        free(jany);
3 q( W' w% F9 P7 q" B        return;       
  b( u9 f6 J6 @6 O}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。7 A/ \' N0 w9 j" k6 j

$ b; b2 H0 [& j( d# `7 \" R/ c你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。$ s: J- S5 d  b% Z
谢谢 “kelvinklee” 指点。* w- v5 e3 M% u
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                , [6 }# A; U! e2 e; ~' r% }1 Y: T# m
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!% p/ ]" i5 T+ u
输入:一个结构体成员的地址指针,该成员所在结构体的结构
9 M# z5 P/ ?8 d* ^8 j" I输出:该成员所在结构体的地址指针3 b' p5 t. q' ?; ~9 `1 J

; t" J. W& u4 K$ G算法:. [1 z/ l- K* Q7 @$ d5 c! `* y
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
  P2 R. L) s3 ]! @2 h2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 08:34 , Processed in 0.165999 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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