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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
% ^) n2 }4 W' H+ `/ N+ m. Y+ x我调试发现他是取得那个字段的地址。
3 s$ Y# W7 a1 \; f9 f; K) t0 d3 A9 A大侠能详细解释一下吗?
/ I5 ?/ o/ Y& z% H1 ]6 e% ^
3 c, S% j# o5 H& U. s4 i  z这段是我Debug的用例。8 |' Q5 e. V/ ?3 R# N, J: j

* ]+ {) p6 o: W! ~#include "stdio.h"
& ~( k5 c2 q. n1 B  C! @#include "stdlib.h"" r- j6 x8 f0 y6 @) ^6 {
#include "string.h"  a9 {) h8 Q$ S  L' W
) |0 R0 O/ W0 a7 L3 H- j1 Q) h
#define        CHAR8                unsigned char
! l& |7 i8 |( |( v' n- V, [) k1 k- \" C
typedef struct _tagjany0 @( P/ S- d0 L) n1 C
{
8 @" W+ U6 m3 k        char name[8];! h( A3 Y! U# T
        int  age;
, ]5 N' k' V( d, X9 Q8 e}JANY, *PJANY;
+ d, e8 r& B& V5 O. h( r" d: R
. b' S. X! n% ~typedef struct _tagowen& x5 w! m0 B1 E" }% N/ S9 {4 a5 k
{& Z- [9 D% N3 u* `3 A
        JANY jy;4 Y3 {. h, S& N3 b% R9 f" m; `7 k
        char home[5];
; C& N7 Q* s4 g" q) x}OWEN, *POWEN;
3 ?9 _  O% A, h% E8 ?) S
5 `% o) c, f2 [! M. C. \#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"' u2 g1 R" g, H( ^2 G- T1 N: P$ P3 W
4 a" H6 o# w% }  B7 K1 |8 _# q' M
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field))): z9 b' O$ \& u* R6 \' ]' p* Q

; U& r4 J" K- I9 B0 q: c#define PEI_CR(Record, TYPE, Field, Signature)   \; J: i; Q: u# v' T7 [
            _CR(Record, TYPE, Field)             . ^$ D9 X! J, T

  j& m2 E1 `$ m4 m" c#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
- E3 g; S7 V' S/ z- `  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
! e8 U/ g8 t2 r! j: e
1 K& L) z' L9 c- @% J1 h! rvoid main()3 q4 G* H1 p* M9 u
{( y4 z, t! H- F. V5 l6 M: Y, E
        PJANY        jany;
: w7 w$ q3 m0 p& u; e        POWEN        owen;
9 w& p9 g/ F8 J9 V        jany = malloc(sizeof(JANY));# P6 g7 e" v" x- l* I
        owen = malloc(sizeof(OWEN));6 j) i! ]; g7 @8 b1 R; S! ]
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
, ?' N# g* |' D/ G& Q, P        free(owen);
0 E/ u  C# P! r2 g# a        free(jany);
( w+ E9 ?, ?7 s9 O        return;       
; \# Q3 L7 ^9 _& `}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
7 N0 O8 q; N1 V% W# p; S( u
: a) Z8 ^, k5 d# A: j$ E8 l你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
& v6 m9 {( k% \$ c谢谢 “kelvinklee” 指点。9 D. }! O# Z# T2 ?$ L
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
2 {: F/ L+ _9 Z9 k, p/ H* x3 P.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
+ G1 u& P4 x; g* `- e& `输入:一个结构体成员的地址指针,该成员所在结构体的结构$ E* X0 S$ W# M0 A% t
输出:该成员所在结构体的地址指针
$ z$ R0 u. [( p, H4 j( `4 \# ^6 X; _) Q; n
算法:* ], z7 {2 i- C- s4 h
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
" S, F$ K9 Y, e; {/ b2 P" h3 Q2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-20 03:47 , Processed in 0.043301 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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