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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?4 a* _! ?8 b( n0 T2 ~6 _
我调试发现他是取得那个字段的地址。" U5 w% {4 \" ^( `  J0 j, w
大侠能详细解释一下吗?
0 m& \" J" c5 S; q. y" u9 k
6 b# m5 p+ z, S4 @. d0 n% C8 k7 S这段是我Debug的用例。
* W+ \- W) y$ h3 I: Q# L  {; j8 a3 [: }+ B2 g1 w
#include "stdio.h"
- j8 m5 |; @8 k#include "stdlib.h"! ~. u3 g7 X" y  |8 P$ F
#include "string.h"
  i6 k3 I0 Q1 Z) o8 p% P- }/ C- Q  j* e  c0 x, p: f6 ?
#define        CHAR8                unsigned char
: p; H% b) i! v# `
0 N  P: `' Z8 {5 P# `1 h1 C/ Vtypedef struct _tagjany& \2 |4 u( U! O6 a
{2 [1 @" b4 q5 o' {$ ]
        char name[8];) x% s  R2 m" N) \( K# o  _
        int  age;
3 Y9 J. t; S' Q$ N7 E) u}JANY, *PJANY;* h% L2 ?# a% f1 d& o$ w/ n2 q

# d( L# _  H3 W- Ytypedef struct _tagowen- p9 F! @7 c" y! U- {
{
0 o3 q' X& I% H7 ~6 e4 o        JANY jy;8 r- }# s% C; `
        char home[5];0 r; }- _( f+ \: A0 n
}OWEN, *POWEN;
5 T+ M8 m, h) W8 b1 k
" y% b, r5 `1 R$ ]#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
1 h2 d4 S7 W) G- N1 C
- }% M& C1 H# E#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
: {3 `  m. G' C, z3 a
" x: F: `& L6 g  w3 h( n* y$ V#define PEI_CR(Record, TYPE, Field, Signature)   \% x) p6 k$ E' v0 N3 d2 l) {7 z
            _CR(Record, TYPE, Field)            
: U9 ^8 K8 }/ D* j( h9 j1 g9 |# e8 b% R6 g5 [9 |6 c6 C5 r
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
- [9 F( x7 P4 ]) `. X) w7 n  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))
) N8 t( ]5 T+ \8 T" z
* `4 Y7 s: R& Fvoid main()$ E6 ?. k% U, Y, f
{
* b  I# v3 D9 g' R        PJANY        jany;
: w- d" |, U! A9 k% H8 J$ W        POWEN        owen;
' W6 O7 i$ v  \! |        jany = malloc(sizeof(JANY));, B0 o1 K3 \& k6 P0 A4 l& g
        owen = malloc(sizeof(OWEN));
& k4 |% I; `5 {- s( U+ m# u        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
# y. }" r' }- W+ H" v        free(owen);
7 ^1 g3 o3 E# V! U$ G0 ^$ Z        free(jany);* f+ D( W" \9 D& F
        return;        : j9 s/ ?: F1 I1 e- W; K
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
6 T8 m( A. Q: W. i( o$ L  J4 v8 f6 p6 n! M" q$ ]
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

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

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
0 W9 r* O) w, B/ p) u& V) y# [.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!! N8 x' S, ?' g6 E; r* Z; w
输入:一个结构体成员的地址指针,该成员所在结构体的结构+ \4 Y' S9 e' N! c
输出:该成员所在结构体的地址指针
9 S5 f* w, |1 ]6 h. e5 A5 @6 E' @, b2 b: ^4 b
算法:
$ l( m1 K; t$ l9 T$ s1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量- ?3 P3 G9 k. \" O% [& r
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-12 06:09 , Processed in 0.054627 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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