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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?, u* V. Y1 C% Q( U1 S4 G
我调试发现他是取得那个字段的地址。
6 ]- h" x, O( B& H大侠能详细解释一下吗?9 F6 y: k' R8 l0 i
9 R  D) N+ e" E) h1 q% Q
这段是我Debug的用例。
3 J" `" q2 o/ N
$ W* y0 q( M3 B6 v#include "stdio.h"
( z% x1 y5 Q4 q: Y, V4 K4 @! x#include "stdlib.h"% B; l1 K" t! }: L+ V9 b
#include "string.h"7 \5 U: a0 H2 d

4 \2 O. w/ q5 G: ]#define        CHAR8                unsigned char
2 Z+ A5 e& c0 N, }8 X2 V
/ S, c9 L: U3 _8 ]typedef struct _tagjany6 Z  A( m4 w$ Z: P( P( I. O
{
* T2 f4 v/ i# F3 K        char name[8];+ }: y; |6 W+ c+ e
        int  age;
* M; m2 V5 H1 l. I}JANY, *PJANY;, V6 \) j( Y( f: d3 L$ |
7 ~3 Y' r2 E( W0 q' P
typedef struct _tagowen; h2 t1 Z; f9 S3 X3 U3 k( {
{
2 K: c! ?" G8 o; d2 U        JANY jy;
7 p4 W0 D5 h  M! r4 x5 p: Q# g        char home[5];
( c. X5 z7 A) o0 p, q9 C}OWEN, *POWEN;
' C# `1 w& f& c1 q' L+ e2 \5 ^
8 i) v# O, f+ d4 I, F0 x#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
' z7 i' ^) s: z- e3 `! Q; Y* ]9 e+ Z0 L# N1 ^% j% J0 X2 n: y
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))+ L; v0 c1 c1 B, @) x3 m
0 x( N. n% B- f' A. d
#define PEI_CR(Record, TYPE, Field, Signature)   \+ U# q" K# B8 P) ?. ?
            _CR(Record, TYPE, Field)             + M' [" O# \0 Y+ M2 w+ A
1 o# X$ \/ w1 W1 Q
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
0 }1 X9 x1 y* y% j% U8 q  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))& ~* r, D' i/ C2 a. B
# a0 o9 F( O, Z- s# Y
void main()$ j. j* w  G% i$ |" O. A: J
{/ R0 E/ q: b! S+ X
        PJANY        jany;
- W! ?' c. x, ]  ?# c* v6 P        POWEN        owen;$ p; e" [% e  B4 }8 Z1 H8 V* P- }
        jany = malloc(sizeof(JANY));; g4 n$ _4 u8 D, P9 z4 a
        owen = malloc(sizeof(OWEN));. `$ h5 ]  m# ?) y$ _
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
" ]# r2 Y0 N# t# e        free(owen);9 |4 f$ g+ G) S/ T; t
        free(jany);, ~8 r# n/ G' Y0 |4 |- m
        return;       
: o; Y& L! u. p: y6 B* e) d6 e}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
, ~' n$ A) K- F& t" n; Y3 ]
% [3 }# ^% p% c/ ]' A" I4 E9 D你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
+ v8 J( H3 q6 A# n谢谢 “kelvinklee” 指点。7 u8 O" e; N2 t" @3 ?
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
9 u% q; V# b+ V* ]+ V6 N.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
& N9 V5 h. k6 D% n: K$ s  c) G输入:一个结构体成员的地址指针,该成员所在结构体的结构
& F7 l% D7 c  D  k+ H2 F输出:该成员所在结构体的地址指针
) F# F. W; |" R  l2 }1 J
' g9 w9 D, Z; Q4 B& T算法:; r! F5 f& @9 I; E$ A# g( x
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量8 E* @- L3 d6 p% _% z
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-16 07:34 , Processed in 0.057241 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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