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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
: Q( [' j( N+ ^# g& w2 ^我调试发现他是取得那个字段的地址。, Y& |' k; Y& F: @$ J5 R
大侠能详细解释一下吗?
4 a% _& ]; ]0 e
- h! L7 L0 H3 h9 A; \; X6 b" X这段是我Debug的用例。
; ]8 G. M& G- T: @
# x! U" n0 H, ]2 q7 J; y#include "stdio.h"- n0 S7 {+ ^% n1 X2 v( V, u% ?/ w( w
#include "stdlib.h"
* v9 I$ y" @- J#include "string.h") f6 S0 V" H% U: H  W8 O7 L; Y
7 O2 l: x7 B$ M" `
#define        CHAR8                unsigned char+ ?7 {' `) J3 b/ u
3 J# v7 @$ B* Z( ~$ d* G
typedef struct _tagjany& M1 P( K0 ~$ ]! h  V, z
{
/ K' h, b" i) N. P        char name[8];
( \9 R0 t3 b5 N# ^5 P        int  age;: I1 L# @& V% S
}JANY, *PJANY;9 E; j) X- O7 B* I0 N

( W5 q2 o1 n* R3 }  m/ stypedef struct _tagowen
' b# [5 ~0 a3 F. P4 r) Q{
; V& X. @3 c# w* b% F1 P        JANY jy;
7 K" ^7 b1 h  u$ E: ]0 q        char home[5];$ C' `0 V6 s5 p6 k2 W
}OWEN, *POWEN;
+ b* d+ e' _5 X/ b
0 F+ m3 j  p+ c: U#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"/ T/ u% C  P6 F7 Y* b. }
) G$ w5 h, f8 e
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
' K, }+ f( h" z2 Y/ c( `) i2 y
; A9 }; e, g, d#define PEI_CR(Record, TYPE, Field, Signature)   \
2 C: ]! y( b& x/ K            _CR(Record, TYPE, Field)             , Q* H2 o2 ?$ ?1 J) A& I9 l0 }
4 m+ g1 O: F" c# p# {
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \' [, i7 n* D  y* E5 N
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE)). {" }, V. |* ]9 _- ~# y1 p( q

+ n/ k# }5 J) w5 P+ P/ X/ u' Q! r# }- Wvoid main()
" X" [5 ^" |$ M9 K{7 B; l: T0 T( c9 T
        PJANY        jany;
6 f% K: j0 X9 B        POWEN        owen;  u/ r" f% G1 n
        jany = malloc(sizeof(JANY));; k3 {, I! U% ~; ]8 C2 K* q4 R
        owen = malloc(sizeof(OWEN));
+ g. i( Y" Q8 b& ]% q        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
* X- P9 |4 ^# N, C8 x  Y: q        free(owen);  V* o' z5 d, L7 |0 _
        free(jany);
2 Q( o6 f: h& ~( ]8 \        return;        $ Y" ^3 D# s, T9 a/ M/ R
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。6 s9 A: O  D% E  m7 ?; q
. C6 u# I- C6 Z( e
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
& f: A+ ?% Y( U% J: X: C谢谢 “kelvinklee” 指点。* Z# B; n9 j$ N) J
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                % y- \. t- ?( b  h( U' u* t- y
.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
# M. p  r- ~2 p% z# Q8 X输入:一个结构体成员的地址指针,该成员所在结构体的结构$ @* f% J! |( |1 l& B! B: |
输出:该成员所在结构体的地址指针
7 V- C) U1 v/ G2 P/ P! w+ T8 r8 c3 H$ i! d( g5 ~- z+ x/ t. i
算法:( z( {: p/ J, p( Y
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量1 n: ~& d* u4 m% A2 d4 C- h
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-1 05:35 , Processed in 0.056970 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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