15
2020
04

offsetof的浅谈

#include <stddef.h>

#define offsetof ( TYPE, m)   (size_t )&reinterpret_cast< const volatile char&>(((( TYPE *)0)->m))

宏功能:获得一个结构体变量成员在此结构体中的偏移量。通过获取偏移量取得结构体的地址

/*  Takes a pointer to a member variable and computes pointer to the structure

    that contains it. 'type' is type of the structure, not the member. */

#define nn_cont (ptr, type, member ) \

    (ptr ? (( type*) (((char *) ptr) - offsetof(type , member))) : NULL)

 

这个宏是通过知道ptr的地址,这个地址也是member的地址,使用offsetof计算menber的偏移量,ptr-member的偏移量获得

type结构体变量的地址。

 

 

在nanomsg代码中,

  for ( it = nn_list_begin (&self. socktypes);

          it != nn_list_end (&self. socktypes);

          it = nn_list_next (&self. socktypes, it )) {

        socktype = nn_cont (it, struct nn_socktype , item);

        ......

        }

 

    socktypes 是个链表,保存着结构体 nn_socktype 的 item 成员,所以it指向的是成员item的地址,通过item的地址获得

    结构体nn_socktype 的变量 socktype 。 

原文链接:https://www.qiquanji.com/post/8331.html

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

微信扫码关注

更新实时通知

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。