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 。

时间: 2024-11-05 20:44:48

offsetof的使用的相关文章

编程中的offsetof

linux和windows平台都已经定义了offsetof函数,用于取struct类型中某个变量的偏移量 在stddef.h头文件中,该宏的完整说明如下: #ifdef __cplusplus #ifdef _WIN64 #define offsetof(s,m) (size_t)( (ptrdiff_t)&reinterpret_cast<const volatile char&>((((s *)0)->m)) ) #else #define offsetof(s,m)

C++ offsetof

这是一个宏,用于计算类中某个成员的地址相对于类实例的偏移量 在C++11中,要求这个类standard_layout 基本用法是这样子的: #include <stdio.h> /* printf */ #include <stddef.h> /* offsetof */ struct foo { char a; char b[10]; char c; }; int main () { printf ("offsetof(struct foo,a) is %d\n&quo

C语言笔记(结构体与offsetof、container_of之前的关系)

关于结构体学习,需要了解:结构体的定义和使用.内存对齐.结构体指针.得到结构体元素的偏移量(offsetof宏实现) 一.复习结构体的基本定义和使用 1 typedef struct mystruct 2 { 3 int a; 4 char b; 5 double c; 6 }MyS1; 7 8 /* 9 函数功能:演示结构体的定义和使用 10 */ 11 void func1(void) 12 { 13 //定义时赋值 14 MyS1 s1 = { 15 .a =1, 16 .b =2, 17

typeof, offsetof 和container_of

要理解Linux中实现的双向循环链表("侵入式"链表),首先得弄明白宏container_of. 本文尝试从gcc的关键字typeof和宏offsetof入手,循序渐进地剖析宏container_of之实现原理. 1. typeof (from: https://en.wikipedia.org/wiki/Typeof) typeof is an operator provided by several programming languages to determine the da

理解#define offsetof(struct_t,member) ((int)&amp;((struct_t *)0)-&gt;member)

#define offsetof(struct_t,member) ((int)&((struct_t *)0)->member) 这个东西很多人应该知道: offsetof是用来判断结构体中成员的偏移位置.他是一个宏定义. (struct_t *)0是一个指向struct_t类型的指针,其指针值为 0,所以其作用就是把从地址 0 开始的存储空间映射为一个 struct_t 类型的对象.((struct_t *)0)->member 是访问类型中的成员 member,相应地 &

C语言之offsetof宏和container_of宏

首先我们要明白一点通过结构体变量来访问结构体中的各个元素时,其本质上是 通过指针的方式来实现访问的,只不过是这个时候编译器帮自动帮我们计算了每个 元素与结构体起始地址之间的偏移量而已 一:offsetof宏: #define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER) 1:参数与返回值分析: (1)TYPE是结构体类型,MEMBER是结构体中一个元素的元素名 (2)这个宏返回的是member元素相对于整个结构体变量的首地址的偏移量,

typeof、offsetof、container_of的解释

链表是内核最经典的数据结构之一,说到链表就不得不提及内核最经典(没有之一)的宏container_of. container_of似乎就是为链表而生的,它的主要作用是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针,最典型的应用就是根据链表节点获取链表上的元素对象. container_of的宏定义如下: #define container_of(ptr, type, member) ({            \ const typeof( ((type *)0)->m

对offsetof、 container_of宏和结构体的理解

offsetof 宏 #include<stdio.h> #define offsetoff(type, member)      ((int)&((type*)0)->member) /* ((type*)0)->member 释义:声明一个相应类型的结构体指针,该指针指向0地址处.再通过该指针访问各元素.我们只要获取一个指针就能访问其内部的元素吗,可以这么搞?其实我是想联系全局和非全局变量,通过上面这个代码也许你不明白我要表达的意思.请继续慢慢看,直到本文后面,结合本文

C语言中offsetof宏的应用

1) #define offsetof(s, m)   (size_t)&(((s *)0)->m) 2) #define OBJECT_HEAD_ADDRESS(ClassName,MemberName,Addre) \Addre - offsetof(ClassName, MemberName) C语言中offsetof宏的应用