winbondowen 发表于 2008-7-12 20:55:56

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

请做EFI的大侠&前辈指点一下,红色标记的那个宏怎么解释?
我调试发现他是取得那个字段的地址。
大侠能详细解释一下吗?

这段是我Debug的用例。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define        CHAR8                unsigned char

typedef struct _tagjany
{
        char name;
        intage;
}JANY, *PJANY;

typedef struct _tagowen
{
        JANY jy;
        char home;
}OWEN, *POWEN;

#define PEI_CORE_HANDLE_SIGNATURE "owen.lu"

#define _CR(Record, TYPE, Field)((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))

#define PEI_CR(Record, TYPE, Field, Signature)   \
            _CR(Record, TYPE, Field)            

#define PEI_CORE_INSTANCE_FROM_PS_THIS(a) \
(PEI_CR(a, JANY, name, PEI_CORE_HANDLE_SIGNATURE))

void main()
{
        PJANY        jany;
        POWEN        owen;
        jany = malloc(sizeof(JANY));
        owen = malloc(sizeof(OWEN));
        jany = PEI_CORE_INSTANCE_FROM_PS_THIS(owen);
        free(owen);
        free(jany);
        return;       
}

kelvinklee 发表于 2008-7-13 10:23:26

这跟Linux的List的结构是一样的。

你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。

winbondowen 发表于 2008-7-13 13:17:25

其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
谢谢 “kelvinklee” 指点。
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx

xtdumpling 发表于 2008-7-25 22:52:49

mark                                                
.

xtdumpling 发表于 2008-7-26 08:50:17

哦,终于理解了!
输入:一个结构体成员的地址指针,该成员所在结构体的结构
输出:该成员所在结构体的地址指针

算法:
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
页: [1]
查看完整版本: 请做EFI的大侠&前辈指点一下这个宏。-谢谢!