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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?2 f! g( }- I% \% X- _
我调试发现他是取得那个字段的地址。
9 l5 e5 _+ A0 Z3 j大侠能详细解释一下吗?
& Q3 U( `  ~' {$ |( l. L+ G5 j( g- l- G/ C: z9 u4 x, W4 D
这段是我Debug的用例。( z2 S) x2 S/ h2 W

7 t. v0 d" Y* K/ d% S# H#include "stdio.h"
7 D2 z0 ?! `! B5 m  l3 k#include "stdlib.h"0 a# s9 s8 J! J* T
#include "string.h"
$ M; k4 o1 Y- o5 z1 Z/ T4 |& K
6 h5 Z; M3 B! A. L' p4 C  V- J#define        CHAR8                unsigned char
: `0 i  I3 j! g; f' Z* X  b4 _' F" S* [, K
typedef struct _tagjany
. I: ^! C5 l6 W; |! ?{5 R* L" \( Y3 y/ ~( ~1 j, q
        char name[8];2 l/ y+ D. R; j' @
        int  age;
/ n0 L* @4 I- |' R}JANY, *PJANY;
% O! ?' i+ `/ o' G" D: M3 }' x0 Y3 I, j
typedef struct _tagowen
2 Y7 `% H5 p$ D2 [/ J{7 C* D, G$ U* D& Y2 u
        JANY jy;
* C& b0 Y- _; q1 g9 H. g# s        char home[5];
# k. z4 G  U1 v/ P}OWEN, *POWEN;
6 A5 Y3 P7 i) n: ]9 e
, P( ]+ J5 M# a8 u#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"9 ]* [* e% n5 N2 |. U
7 W5 J* V& ?7 X- O
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
/ G8 v' Y7 c/ \4 [1 h  N) q/ m
' o& Y! V' X  f#define PEI_CR(Record, TYPE, Field, Signature)   \
  U. {/ Y1 X; Q% D+ Y" h            _CR(Record, TYPE, Field)            
, L5 E' i, K3 A
" n! X: j7 j3 d" V; b#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
, N/ Y4 n, Z' \, {  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))$ J2 O# m: U. m- L' p! f
- H7 K! S, P% Z' t& ~' y' j
void main()
  w  ?8 Q* G$ M$ E{5 m" x2 g) ]$ d/ _3 D
        PJANY        jany;/ ?; _6 |/ p8 Q4 a' U/ ]: t
        POWEN        owen;
% O" O! X# }. y9 [+ _+ f1 X        jany = malloc(sizeof(JANY));
! v0 v8 ?4 L+ [) R        owen = malloc(sizeof(OWEN));
+ h2 V0 X/ a4 R# M( g        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);% B0 `6 Z3 w; s+ @
        free(owen);
& {/ S  d: n# V/ l  l) r& R" g( ?        free(jany);' j, m/ j4 n4 V; a
        return;        ( C  N. M: X- c
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。- \2 [0 A3 w; ^: B. j4 O$ ]9 P

7 O% {9 y* Y! f2 O: F5 u3 V; Z你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。& V6 X% v7 ]8 Q1 c: L3 ~; a' D
谢谢 “kelvinklee” 指点。& B( j- h9 m  q2 n2 w
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
9 s; Y/ b( g: r0 S.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!# _2 F' @4 M! h, c/ w, A
输入:一个结构体成员的地址指针,该成员所在结构体的结构) }8 D1 V! W$ s# \: [
输出:该成员所在结构体的地址指针
, ?. b7 V9 u- X$ y% K) M( u, }1 z7 O
算法:1 d2 m2 S' p3 A7 i
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
+ N" `% a* ~3 O2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 15:55 , Processed in 0.180217 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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