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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?1 e+ H6 P2 _6 H- E5 R% B. ]
我调试发现他是取得那个字段的地址。
- i1 x: J9 u! V0 C7 j大侠能详细解释一下吗?
5 B6 ]3 D$ a' [: w$ T! |8 w0 R/ n8 @8 P
这段是我Debug的用例。/ S% m1 _8 O. a, T, y

- R8 ~1 W6 e: _7 Q: P#include "stdio.h": @3 v( M: R7 V/ F4 q" x3 \
#include "stdlib.h"$ r7 j. b9 J7 I, l: b# ]9 @- ~
#include "string.h"
- s' U, U7 u: J' B0 t; V$ X
1 o- o- ^2 ^* O' N+ v1 K% i( q#define        CHAR8                unsigned char( R" ~# N' T* k6 A' C1 s/ z- J

3 x% C* n+ D( O/ l" Q! d  L: m) ktypedef struct _tagjany
, {0 B3 T/ G+ j$ A6 k; D{
: p. M2 X1 S0 Z5 x. B" k1 ^; s( g        char name[8];
4 s9 u$ C8 B$ d  b        int  age;
" R- O" O# Y. z, Q; K7 X, b}JANY, *PJANY;; g  F, A0 r9 j2 z: p8 o7 C
' i- u- C6 J1 M5 @4 N
typedef struct _tagowen3 f  X4 O' L$ I% S$ _6 g: D- S. v/ F
{$ ?- o1 Z9 V/ r
        JANY jy;
; l, r2 G/ m9 H) A9 G7 a" x* }        char home[5];" Z( d  {6 |0 g
}OWEN, *POWEN;' g0 ?8 [! U- n  N3 Z; H4 l( L- U
' f, n; o+ Y- z9 `
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"8 o3 i  P  S* {, ]8 p1 j# X
& l) M3 W1 V  a5 S- |8 [; q6 i% r
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
0 @) t5 J4 |" P4 d( @* [% W8 i1 j6 r5 s. ?6 B
#define PEI_CR(Record, TYPE, Field, Signature)   \. K4 x" n0 E5 [( |- N  l
            _CR(Record, TYPE, Field)            
% r3 s0 h( z. f, n* d
- l$ d1 z$ G8 B# D$ ?+ V#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
/ S+ a9 W& Q/ e' y" O3 v  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
# p( N* N' s) }; n% }+ p
5 R- p7 d- C3 V$ Y2 L/ Z+ Zvoid main()6 @3 p3 u* v# w. Y
{
  U* M6 w9 t* M5 e$ b4 {" ]        PJANY        jany;
7 {4 U* E. A" n& o# {( H* m        POWEN        owen;
3 c( C5 \% t1 y( E0 P" u        jany = malloc(sizeof(JANY));
# l; [5 @0 n) n4 k+ ]# w        owen = malloc(sizeof(OWEN));
! ]. c$ s7 A& B; P; T        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
  U: P( y( M8 D        free(owen);5 {3 f* s, M3 M$ @7 w% ?
        free(jany);- F& K5 X: Z( [
        return;          Z9 D' _9 }9 O6 P( D/ M& k
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。/ R, A5 t9 S0 B5 o2 l
& x4 J$ P& b; R& C6 o: t, o# c
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
; b1 e! Q1 k8 b+ h- g谢谢 “kelvinklee” 指点。% U. n( k" x  D' X4 ?. _, w
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                ( l/ x" Z0 i. X, I" j% _% z, w6 b7 X
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
; a2 |0 R+ V- C+ E3 K6 h, `& q输入:一个结构体成员的地址指针,该成员所在结构体的结构2 G) N  K  p! k" W5 u* s7 Y3 n; t
输出:该成员所在结构体的地址指针, H: U& [/ q% u- L
0 N- k" v$ U) S5 m, J
算法:
2 ?* \2 C  I1 ^0 z/ a; _) m1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量0 B9 O$ O7 ?$ R9 V' [2 W
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 17:41 , Processed in 0.092483 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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