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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
. v/ }  I, ~9 {5 [  C  K我调试发现他是取得那个字段的地址。3 ?) p% G: `& [5 l7 A; z7 a8 r5 H
大侠能详细解释一下吗?
& y0 @! m! v7 K% e- g# O2 R
& d$ Y/ Z1 ?+ Q* d: s( u. o这段是我Debug的用例。8 N8 V+ O3 n+ K+ ~0 H

" c* U* R, m7 K* [( _7 \#include "stdio.h"- L, W! i9 ~9 W5 m8 ~
#include "stdlib.h"! s7 m; J" D4 B
#include "string.h"2 y" ]7 H1 T) K, c8 O! l, a9 R
8 c8 T% W% `1 T5 V2 T2 C, ^7 _  Z! `) g& u
#define        CHAR8                unsigned char; T) Q- w! ~4 T+ G: F9 k
  s7 a- {, u" G* K8 p( ?
typedef struct _tagjany& n6 w- l# C" j+ c6 [( U/ l3 m
{5 ]- p6 s0 F: W6 j& k
        char name[8];
! i0 Y6 ^- v" X7 m9 [' a) F        int  age;; ?1 V- Z* d8 d1 t# C
}JANY, *PJANY;
6 R" D/ f( ^& Y8 |: ~8 b: H
$ U- Z2 a9 L: D$ M9 Jtypedef struct _tagowen( ?$ T8 C9 J; {  q# k2 V" {
{
& L; Q; E/ l3 j3 S        JANY jy;
5 X6 |2 d& o" t  s        char home[5];8 x- C) d! [" i. [4 s
}OWEN, *POWEN;
2 Y( l8 L1 T* ~: d
5 ^0 ~, P) i( R3 ]3 x6 Y#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"! {  ?- V. E$ I% v  t+ G( i) {( ]; C
/ w, g, _3 ^4 {5 D/ s: o3 Z
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))0 m% Z1 h3 o1 H' K+ X' P/ I
: O0 D8 \% V7 t" A& [7 u0 _/ b
#define PEI_CR(Record, TYPE, Field, Signature)   \
2 W0 E& I9 i5 j/ `# z2 X" Y            _CR(Record, TYPE, Field)             ' _" o. Z9 F1 @3 k! U
* t" z) Q9 ]+ ^; d
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \* D" Z' s8 A* ~0 {
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))! {( j+ b! c3 k3 F7 G- {

& }9 ]5 Q8 p& ]. N+ v+ I5 T2 ]) i0 ?void main()
! c4 _9 n3 ]8 c{7 e5 W( K! T9 Q( P: ^
        PJANY        jany;
9 J- ]' k8 \- l        POWEN        owen;
3 C8 ^! w$ M* Q. f) B7 N! d        jany = malloc(sizeof(JANY));
  n  x5 x' |% Y* p        owen = malloc(sizeof(OWEN));& }2 C- k5 h  X! i
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);9 N5 H' R$ ^" b' ]9 C2 B
        free(owen);
5 ?: H$ s; E! v5 S% x        free(jany);
* }; e2 O( G" w2 Y        return;       
+ c* Q  J. i* S! Q0 P}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
# A4 Z. t# T! ?* R- d: u, N- i8 `, p9 ^; ?
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。2 n7 y$ ^7 \2 y5 q8 Z/ }
谢谢 “kelvinklee” 指点。
; p7 O4 e" x' ~2 ]! z  ?0 Z1 Khttp://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
$ z5 R- D9 {: L3 _% S+ v4 w.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
5 \( g! }- Y* V输入:一个结构体成员的地址指针,该成员所在结构体的结构- D2 Z$ A' v; P/ x% N# x
输出:该成员所在结构体的地址指针, S3 t& {8 P; P5 d# E

) ]) K1 j+ `( `: L; I; J算法:" l7 P' _6 ]  P8 ^
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
6 H2 a  G5 b- F7 p0 f2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-4 20:10 , Processed in 0.072933 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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