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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?/ ^! W, O( \6 ^) k& L" K9 \
我调试发现他是取得那个字段的地址。
3 G; x; _0 W. I7 X: W6 J+ L6 x大侠能详细解释一下吗?& M, z+ |- S) @$ U7 o. M( i- W% F

; t& m3 E" J1 H- ]3 X这段是我Debug的用例。' E9 p+ j! _1 q7 Z7 Y* b$ H
$ r" p+ ^+ E& ]$ X# H# b
#include "stdio.h"
# M4 F- {  O; i) o#include "stdlib.h"
/ A1 i* Q  S' b: i4 b#include "string.h"
( I3 D9 L' G% l$ w+ {
! h1 t$ l: b# j2 P9 w% m#define        CHAR8                unsigned char6 Y7 \0 o' \4 Y- P3 f* [) f+ F
6 D# L# S( S% K9 ^- Q
typedef struct _tagjany3 A. H* B$ |; T$ T5 R$ o
{8 Y" J- E8 F4 ]9 e$ b" J/ G
        char name[8];
! W  b) ?% r) m1 a/ `# Y% H; _  x        int  age;- ]2 s4 Z  e* ]6 \6 B; z. R
}JANY, *PJANY;: b1 d' v0 t8 V" R" Y

3 h) o9 f/ y$ u% t7 D! Ctypedef struct _tagowen
$ b& R& w7 J! V{( Z# j! R7 t0 g& g2 k3 S  B
        JANY jy;, J' T2 g5 |9 H4 \
        char home[5];
: Y3 l4 e8 K, M3 r5 a}OWEN, *POWEN;
' k. T  p2 w( K  N1 i! c. e
. ?2 ?( `/ H( `5 X" i7 f#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
+ {- q- M; @! t4 k) t0 K' J
+ w2 @  \( V" f+ `#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))/ b  i" R7 ?  u8 W

9 n' G, D6 m8 p% Q% c3 k#define PEI_CR(Record, TYPE, Field, Signature)   \
0 h$ `0 }/ [9 I1 B0 e            _CR(Record, TYPE, Field)             : r  q/ s5 ], p% P/ x( R! y' }+ q

- W! d. {& N& i5 J#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \) [( n. ^3 i7 M* I! z; s
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))9 z! B; P  M9 ~! s7 \% Y

1 O  Y+ l7 Z8 T  U+ xvoid main()! \2 A+ z7 S4 F* q; v
{- j1 l% q* g$ D- ~8 D+ S
        PJANY        jany;# h) [7 A) C) ?5 H+ v5 m( p3 ~- B
        POWEN        owen;
" C/ H) B2 ?1 w) t* ~2 j! t        jany = malloc(sizeof(JANY));4 E' N: X' _* Y! o; o
        owen = malloc(sizeof(OWEN));9 [5 [# y9 I4 h
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
) X+ q# t. e# K: v( ], `        free(owen);
6 ]4 @4 O! X6 e0 t- D        free(jany);
; ?! S$ q3 v. H& Z' |3 G        return;        - q' [6 O# f& W/ N! I, O9 G; g
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。1 Y# m: `! `3 ~5 V

$ U8 t5 W$ N+ V3 ]. i% W0 l) [% G你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
1 ]9 A* E4 ?8 U% u谢谢 “kelvinklee” 指点。) V9 {5 S: O& c  P6 ?7 i- Z+ Y
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
$ s5 ~2 `0 [: {# c.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!4 P1 Z0 `$ [9 [# w3 o
输入:一个结构体成员的地址指针,该成员所在结构体的结构
  M% j7 D3 b" B" X1 s输出:该成员所在结构体的地址指针$ D" f- L6 G" R) h: p" `/ @* }- v

; a# @2 Z/ @! A4 t7 e# [算法:
4 X' K6 ~% y7 @% S8 G- p1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量& W5 `) z# x- S) A+ p2 ^
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-3-5 00:08 , Processed in 0.026384 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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