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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
  o% T; e9 O6 o0 r* z$ l我调试发现他是取得那个字段的地址。
7 C8 c0 G* g1 V大侠能详细解释一下吗?
- n" o1 @) F. h+ K+ p8 b1 J5 y; }: ~
这段是我Debug的用例。7 o" q! i& ?/ M. P, N0 v

( W$ v% J5 [4 `: P+ R& \. A#include "stdio.h"
$ M0 ^/ A; J. b- z* F9 z) A: H/ [#include "stdlib.h"
  G3 D! r' v/ q% ]#include "string.h": \  E1 e1 ]3 `: M) }' r

+ {1 L! P7 G/ m# ~, [#define        CHAR8                unsigned char
; I2 b0 K' D, B# V$ `; v! v# h9 @/ O4 r, C& I# |2 k" z8 I
typedef struct _tagjany
4 _5 j- ]( b7 _" P{- s* d! Q/ a% K- T+ n2 ]! Y; f+ f' \& P
        char name[8];
( X1 \. B0 j  Y5 }. `' i& t        int  age;
' M8 g- |- M) N$ \& i+ X7 w& q8 S}JANY, *PJANY;
% T) Z- M  v& A/ b# C
' u+ _5 a( T4 g5 a( q  Vtypedef struct _tagowen4 g8 j' t3 h  `! B
{
# l5 G/ ~% Z# W5 n, A9 Q        JANY jy;3 Q/ u, T0 g' g6 v" z! G" J: c7 n
        char home[5];% h' ?& V: P- P
}OWEN, *POWEN;
8 Z4 I  j! N5 K4 V8 |- M( L; }6 _6 ~
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"; {- Z% k1 N+ P" w) [8 |: M7 B

9 s# \* A% x' }# ~$ ^. U#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))5 H3 _- t! V4 |; c6 p6 }

# `+ W$ v/ p: J7 I4 f! S& K+ I0 X#define PEI_CR(Record, TYPE, Field, Signature)   \* V* J9 g9 M' z. k3 ]; X3 L
            _CR(Record, TYPE, Field)             , n& _7 F, A4 f  d1 c8 o

7 ~0 q4 o% b4 ~#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \$ v' ^) R; r4 D2 t6 e; X5 [& @
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE)); Z) u& ~4 W4 h- L# a4 M1 o
# ]  {3 }# ?; ^9 f
void main()( ~/ o6 y9 F" F/ ^+ K6 D( t
{7 D) l4 V1 i8 Y
        PJANY        jany;
  ]. N6 Y% z+ C  h$ M2 S        POWEN        owen;
* j3 ~3 i4 o9 ~$ O7 {" i        jany = malloc(sizeof(JANY));" z0 {+ I+ I7 u' d
        owen = malloc(sizeof(OWEN));
* {( P% N+ V$ n; V        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);4 ]& ~5 O8 F( C/ {0 _
        free(owen);6 E( [8 f( }3 Z$ c7 z
        free(jany);. W  |# h7 @7 P: c" [
        return;        % [' l$ u" A0 D, a7 w, h) \$ B2 L6 D
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
# v' V6 F( S% _* D6 B
- {7 k2 d0 a& w  I你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
. I& w- S' `1 b3 o8 f1 l+ C3 O谢谢 “kelvinklee” 指点。3 j. {4 J; \) F+ j. @
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                + G- Q  `! o9 A
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!5 H& V+ ^; m7 D. }" Z2 {: H
输入:一个结构体成员的地址指针,该成员所在结构体的结构
/ M- t7 b3 ~. ]/ W5 Z$ V1 q输出:该成员所在结构体的地址指针
' }) v5 q( S0 Y8 i- T, e2 j3 j5 h$ Q+ {% V6 M6 k
算法:
  a$ j' Z( e0 j8 d1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量7 J! i1 k! D  x5 ]
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-8 08:09 , Processed in 0.101854 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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