URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 16 » 帮忙解释一下这个宏的一些细节。
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
帮忙解释一下这个宏的一些细节。
 
Re: 帮忙解释一下这个宏的一些细节。 - zhllg [2006-04-29 13:20 | 272 byte(s)]
 
 
 
Re: 帮忙解释一下这个宏的一些细节。 - ddd [2006-04-28 22:01 | 98 byte(s)]
 
 
 
Subject: 帮忙解释一下这个宏的一些细节。
Author: onlyflyer1    Posted: 2006-04-28 13:30    Length: 759 byte(s)
[Original] [Print] [Top]
#define OFFSET(structure, member) ((int) &(((structure *)0)->member))
这个宏是取得一个结构中的偏移,下面的程序会输出8(考虑到内存对齐)

#include <stdio.h>
#define OFFSET(structure, member) ((int) &(((structure *)0)->member))
typedef struct test
{
int a;
char b;
float c;
}TEST;
int main()
{
int i = OFFSET(TEST, c);
printf("%d ", i);
}

谁能够将#define OFFSET(structure, member) ((int) &(((structure *)0)->member)) 彻底剖析一下啊。还有有谁能用sizeof实现OFFSET的另一个版本,上次我去一个公司笔试的时候被问到这个问题,最后没有答出。
[Original] [Print] [Top]
Subject: Re: 帮忙解释一下这个宏的一些细节。
Author: gogoliu    Posted: 2006-04-28 14:12    Length: 763 byte(s)
[Original] [Print] [Top]
看明白了宏定义,解释一下:
这个宏定义的作用是取得某个结构中的某个成员在该结构中的偏移。要实现这个功能很直接会想到用该成员的指针减去结构体指针,这个宏就是这样做的。而且由于编译器在计算时(编译时计算不是运行时计算,我已看过gcc的汇编代码)无需实际访问内存,所以该宏使用了地址0作为结构体的起始地址。实际上结构体地址可取不越界范围内的任意值,但是取0不会越界也省得再减去结构体的起始地址。解释一下宏定义:
0
内存地址
((structure *)0)
强制0为结构体起始地址
&(((structure *)0)->member)
取得结构体中member的地址
((int) &(((structure *)0)->member))
把member的地址转换为整数(因为结构体起始地址为0,所以没必要减去0)

这个宏很精巧,期待sizeof版。
----
killall 眼高手低 用心浮躁 浅尝辄止
[Original] [Print] [Top]
Subject: Re: 帮忙解释一下这个宏的一些细节。
Author: onlyflyer1    Posted: 2006-04-28 16:12    Length: 33 byte(s)
[Original] [Print] [Top]
谢谢gogoliu,同样期待sizeof版本。
[Original] [Print] [Top]
Subject: Re: 帮忙解释一下这个宏的一些细节。
Author: ddd    Posted: 2006-04-28 22:01    Length: 98 byte(s)
[Original] [Print] [Top]
我感觉sizeof不能做到。
也许某些特殊情况sizeof能够做到。
严重怀疑这道题的正确性。
----
I solemnly swear that I am up to no good
[Original] [Print] [Top]
Subject: Re: 帮忙解释一下这个宏的一些细节。
Author: zhllg    Posted: 2006-04-29 13:20    Length: 272 byte(s)
[Original] [Print] [Top]
内核里双向链表的实现严重依赖这个功能
#define container_of(ptr, type, member) ({
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})
----
[Original] [Print] [Top]
Subject: Re: 帮忙解释一下这个宏的一些细节。
Author: newroot    Posted: 2006-04-29 16:03    Length: 681 byte(s)
[Original] [Print] [Top]

内核里双向链表的实现严重依赖这个功能
#define container_of(ptr, type, member) ({
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})


今天刚看到!!!
是不是这个意思

type是一个数据类型,它有一个成员叫member,
第一行的意思就是, 申请一个变量叫__mptr, 它的类型和结构type的成员member类型一样
__mptr 指向ptr, ptr是一个member的地址
通过offsetof获取到member成员在type结构中的偏移量,

然后将__mptr指针前移member在结构中的偏移量,就指向了包含ptr这个成员的结构地址

[Original] [Print] [Top]
Subject: Re: 帮忙解释一下这个宏的一些细节。
Author: zhllg    Posted: 2006-04-29 17:48    Length: 10 byte(s)
[Original] [Print] [Top]
是这个意思
----
[Original] [Print] [Top]
« Previous thread
菜鸟求助,这条命令运行不了是为何
C/C++编程版
16
Next thread »
请教一个socket编程的问题
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:10, cost 0.040222883224487 ms.