关于宏定义

nebula2005
关于宏定义

求助:
test_fun(ptr, type, member) /
((type *)((char*)(ptr) - (unsigned long)(&((type*)0) ->member)))


看的晕的不行...请高手详细解!!!

zhoujianxin
gcc -E xxx.c 找错^_^

葁子牙
宏替换 :mrgreen:

Edengundam
根据结构体某个成员指针, 计算这个结构体的首地址吧.

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);


结束

nebula2005
谢谢,已经明白了,谢谢各位.

77h2_eleven
兄弟们,我太菜了,没看懂。
能不能把原理介绍一下?

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);
}