nebula2005
关于宏定义
求助:
test_fun(ptr, type, member) /
((type *)((char*)(ptr) - (unsigned long)(&((type*)0) ->member)))
看的晕的不行...请高手详细解!!!
softsongs
3楼的是正解,举个例子吧:
test_fun(ptr, type, member) /
((type *)((char*)(ptr) - (unsigned long)(&((type*)0) ->member)))
typedef struct ControlPoint_tag {
struct ControlPoint_tag *next;
struct ControlPoint_tag *prev;
}ControlPoint;
/ *
* StuInfo store the infomation of a student. This is just an example.
*/
typedef struct StuInfo_tag{
unsigned StudentID; // 学号
char StuName; // 姓名
ControlPoint cp; // cp 应该是一个control point, 用来控制插入某个链表之类东东。
...
}StuInfo;
// 通常我们会用一个链表来维护多个学生,可能是按照学号排序。
// 当我们遍历到某个节点时,如果想根据这个节点访问到该学生的信息时,可以用如下语句:
ControlPoint *stuList;
StuInfo *pstuInfo = test_fun(stuList.cp, StuInfo, cp);
结束
xxyqiufeng
[quote]原帖由 [i]softsongs[/i] 于 2007-3-19 21:50 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=6566850&ptid=911826][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
3楼的是正解,举个例子吧:
test_fun(ptr, type, member) /
((type *)((char*)(ptr) - (unsigned long)(&((type*)0) ->member)))
typedef struct ControlPoint_tag {
struct ControlPoint_tag *nex ... [/quote]
呵呵,是4楼!
这个见得最多的是linux内核里面的list_head吧,用到它一般就要用这个来得到结构体的首地址
err7dd
回复 #7 77h2_eleven 的帖子
我想要求结构首地址,两个条件: 1.所知结构成员变量的地址 2.结构首地址与所知结构成员变量的地址差
(&((type*)0) ->member),用一个type * 指针指向0地址,并求得其成员变量member的首地址,即地址差。
(char*)(ptr),为所知结构成员变量的首地址。 相减那么得到的就是所要求得结构首地址。
给个例子看看:
#include <stdio.h>
#define test_fun(ptr, type, member) /
((type *)((char *)(ptr) - (unsigned long)(&((type*)0)->member)))
typedef struct tag_stuAA
{
int a;
int b;
char c[12];
}stuAA;
main()
{
stuAA stAA;
stuAA *pstAA;
memset(&stAA,'/0',sizeof(stAA));
stAA.a=2;
stAA.b=3;
strcpy(stAA.c,"123");
pstAA = test_fun(&stAA.b,stuAA,b);
if(pstAA == NULL) printf("NULL POINT!/n");
printf("%d/n",pstAA->a);
printf("%d/n",pstAA->b);
printf("%s/n",pstAA->c);
}