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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
, B' a% b, A2 C2 _, |7 g3 r6 q我调试发现他是取得那个字段的地址。8 c0 m- k% O6 W/ q* W* ~
大侠能详细解释一下吗?
4 z1 }5 K; R: T! S+ h! h( ?7 ~$ Q, L, x# ?
这段是我Debug的用例。
5 I5 H2 @% G. @
, X& n# Q  ^$ g5 F: D" H9 Y0 t#include "stdio.h"2 S3 i# y. K7 X3 S2 q% q
#include "stdlib.h"' }- e1 C% w) m6 t# B
#include "string.h"
5 N& r( T$ {& L: l, r* W
# E" w$ C+ c) M" I( w2 U9 y#define        CHAR8                unsigned char
8 ]8 F5 B0 p" t/ C0 \0 U. A  W
! C8 m8 `0 U2 {- ?  @typedef struct _tagjany' D( _- X' a% g* S+ \
{7 R  ?( N/ m4 P4 n
        char name[8];, I5 X2 J% e& S: p; s4 R, l3 h
        int  age;
9 Q. l  w% U7 Z4 K}JANY, *PJANY;9 p6 a: C, _4 x: N4 d

) W) Q' X. V% `( ^3 atypedef struct _tagowen
4 J" {* E: l+ i9 n{
) X1 e+ ~3 ~# Q/ [4 J% @- {        JANY jy;) C8 c, a# x: V2 b, h) v( D& L
        char home[5];- ]$ j9 o' e5 ~  V
}OWEN, *POWEN;+ f1 p8 I6 _7 g2 ^+ Q
- L) c4 _! a7 E5 z( |
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
" O' ^6 w  Q: T5 J$ e3 H' [  K+ ^4 N5 o
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
# y- a- H2 |" b4 Q; E; \9 I* r- W- A: ^/ \
#define PEI_CR(Record, TYPE, Field, Signature)   \
  r+ J  Y7 W7 x' v            _CR(Record, TYPE, Field)            
, g4 J- y# Y4 G0 ]% J; l& e5 B( n! E( g! Z' R% L, ?6 W( f4 z
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
- \" U( |, }5 \/ L1 j  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))8 `) [+ c; _/ E8 v+ L

2 k- m: X8 x) c+ a. `void main()4 F4 O; Y5 l# S1 d( y, q( b
{! y* F. |2 t) ]
        PJANY        jany;
- ?( }( Y5 O" K! h0 r: L# x        POWEN        owen;( ^, T" X8 _1 B7 x# p
        jany = malloc(sizeof(JANY));
! ~9 Q- ?7 P! Y        owen = malloc(sizeof(OWEN));- j# p# r+ _% e) g$ T) L
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
# v6 x3 K) i5 j7 ]/ N( t        free(owen);* N; F  K0 [0 z' \
        free(jany);- Q6 J  Q8 \! U4 B
        return;        , N- [$ m; R& q6 }& v, j3 X5 f
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
) b  J6 T2 w2 x5 d
4 Z4 U& ~7 O& r0 Z& Q' d' B你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
& z# v# q8 m( s+ g- }% {: G谢谢 “kelvinklee” 指点。
  H' \' q% V+ Yhttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                  E$ R$ u% ^, d; ?1 s6 g0 n
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
- h4 N& C, U: E- k: d& K输入:一个结构体成员的地址指针,该成员所在结构体的结构' {: f+ S0 T/ q
输出:该成员所在结构体的地址指针1 i  h4 P8 J) S& K: v. |1 }

' b) Z  u6 {6 d* F算法:/ L0 B9 Y  C9 ?8 |
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量! x9 x7 n" \9 H0 m  b$ Z+ x9 k% B
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-16 19:15 , Processed in 0.061420 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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