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

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

[复制链接]
发表于 2008-7-12 20:55:56 | 显示全部楼层 |阅读模式
请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
& D$ E( S- f8 Q% z( o4 j我调试发现他是取得那个字段的地址。
  K; A: i& d, }8 j. G$ z大侠能详细解释一下吗?
4 }4 Q1 @" t; @* N, R" ~1 D& h  v  j  X) q( o8 {! n
这段是我Debug的用例。1 K) {$ s. Q. h* ?7 M8 f
6 f- L/ G. N' V+ n5 L- j
#include "stdio.h"
3 j  s! K; `0 D; U) g0 {- d#include "stdlib.h"
1 z6 w, Y6 t0 ]/ e, ~#include "string.h"( V- N% P" r6 D) B7 t
' e4 ]; y7 y- D; ~' w- t) i
#define        CHAR8                unsigned char
2 J: S5 E+ ~+ C0 `5 M0 |4 r
. P" l5 l# \  I, ztypedef struct _tagjany
! E$ ^' X- J- e6 {* e9 k- t{6 I1 }1 m) Y/ A4 k4 W
        char name[8];
& _. z1 C1 N% j0 R) `        int  age;) a( ]' h/ }( m
}JANY, *PJANY;( ?2 M- e; B% N! D: h  g

( ?9 K, R! B7 `3 }typedef struct _tagowen
# T5 t) ^0 }1 i# i{+ V7 M% S, t( b6 k% A. o
        JANY jy;# [  n6 N$ w# f5 ?! I& c7 i: r; H
        char home[5];% G) M2 O# o7 G( ?9 R
}OWEN, *POWEN;* A3 n: d2 w3 G- O
; @& K: M5 o( L+ `
#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"
. t7 o; d7 x3 {% m+ u  E5 e; j0 q, d0 c9 {1 ?: k/ F
#define _CR(Record, TYPE, Field)  ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
: o; T5 l# [% V' T" Q
$ H8 t; a/ g% K  ^1 W% }#define PEI_CR(Record, TYPE, Field, Signature)   \
% Y( R, y) T$ m$ o5 e& u& u; P            _CR(Record, TYPE, Field)             2 P# @7 v$ w* \! t1 k
  Z2 E) F! i, [; g  v' ^. _* L5 r
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \3 v+ e# y& _1 M) d# S
  (PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))+ C. O' N% i- C$ g, ~- p

& H: o; d* c) Rvoid main()
+ m8 }" w; B* {' T* t8 g- T( p  c" f7 b{1 p( p  a5 I/ j2 t
        PJANY        jany;* h( L$ A, f% o& t' {  p
        POWEN        owen;
% ]: _% C- ~2 F2 j0 T        jany = malloc(sizeof(JANY));6 v3 u  n% V+ \4 h  L/ e
        owen = malloc(sizeof(OWEN));
" U1 T" Y7 S2 {+ T( Y$ B        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
& w. }8 b5 U$ V7 `+ T- L        free(owen);
8 B9 |( X% \2 P, M        free(jany);9 Z. z& r# O9 w. A
        return;        6 f' R2 z' ~) i- G9 l( `! \
}
发表于 2008-7-13 10:23:26 | 显示全部楼层
这跟Linux的List的结构是一样的。
1 ]! _, x; h; H1 Z; B6 p
  b3 I5 l, P1 D你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。
回复

使用道具 举报

 楼主| 发表于 2008-7-13 13:17:25 | 显示全部楼层
其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
6 m7 {0 H. ?: _/ R7 E' C' Z谢谢 “kelvinklee” 指点。
- x# ^4 @! J' `http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx
回复

使用道具 举报

发表于 2008-7-25 22:52:49 | 显示全部楼层
mark                                                
$ `+ |$ F4 I! @" T: l9 y.
回复

使用道具 举报

发表于 2008-7-26 08:50:17 | 显示全部楼层
哦,终于理解了!
, W% U$ K* X# c! ?输入:一个结构体成员的地址指针,该成员所在结构体的结构
+ C8 {' @- i8 P% H6 p输出:该成员所在结构体的地址指针
0 I& H# x1 b' T# ^5 ~" P# Q2 D% E' G* ]+ e$ R! [2 T0 ]
算法:5 o& E( K9 b+ g
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量8 a% e  q6 M3 e! [4 e; V% |7 r
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 19:07 , Processed in 0.037006 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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