请做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;
} 这跟Linux的List的结构是一样的。
你可以在网上搜索“linux list详解” 就可以得到对Linux List的解释。然后你再看这个宏,就好理解了。 其实我们只要知道 &((type *)0)->member 的意思就明白了。它是取结构成员偏移量的一种方法,将常数0强制为结构指针,取其成员的地址,结果就是成员的偏移量。
谢谢 “kelvinklee” 指点。
http://blog.csdn.net/hondrif82q/archive/2007/04/14/1564893.aspx mark
. 哦,终于理解了!
输入:一个结构体成员的地址指针,该成员所在结构体的结构
输出:该成员所在结构体的地址指针
算法:
1.由结构体的结构得到该成员地址和结构体起始地址的相对偏移量
2.该成员的地址指针减掉这个偏移量得到所在结构体的地址指针
页:
[1]