offsetof()用法解析--尚有遗留问题2020/4/8

今天在看代码时遇到下面的用法

typedef struct _C_MpegDecoder
{
    PyObject_HEAD             // == PyObject ob_base;  定义一个PyObject对象.
                              //
                              // 类/结构的真正成员部分.
                              //
    cmpc::CMpegDecoder *_in_Handle;//CMpegDecoder是MpegCoder.h中namespace cmpc下的一个类,这里定义了一个类指针
}C_MpegDecoder;

static PyMemberDef C_MPDC_DataMembers[] =        //注册类/结构的数据成员.
{ //不注册任何数据,因为类数据CMpegDecoder在上层是不可见的
  //{"m_dEnglish", T_FLOAT,  offsetof(CScore, m_dEnglish), 0, "The English score of instance."},
    { "hAddress",   T_ULONGLONG, offsetof(C_MpegDecoder, _in_Handle),   READONLY, "The address of the handle in memory." },
    { nullptr, 0, 0, 0, nullptr }
};

其中用到了offsetof()函数,就把这个函数的用法查了下

offsetof(type,member-designator)会生成一个类型为size_t的整型常量,它是一个结构成员相对于结构开头的字节偏移量.成员是由member-designator给定的,结构的名称是在type中给定的.

例子

#include <stddef.h>
#include <stdio.h>

struct address {
   char name[50];
   char street[50];
   int phone;
};
   
int main()
{
   printf("address 结构中的 name 偏移 = %d 字节。\n",
   offsetof(struct address, name));
   
   printf("address 结构中的 street 偏移 = %d 字节。\n",
   offsetof(struct address, street));
   
   printf("address 结构中的 phone 偏移 = %d 字节。\n",
   offsetof(struct address, phone));

   return(0);
} 

运行结果

address 结构中的 name 偏移 = 0 字节。
address 结构中的 street 偏移 = 50 字节。
address 结构中的 phone 偏移 = 100 字节。

现在再回头来看开头给出的代码

offsetof(C_MpegDecoder, _in_Handle)

代表类指针_in_Handle与结构C_MpegDecoder开头的偏移量,是一个整数

遗留问题: 2020/4/8

1.这里的PyMemberDef 按照通俗来讲,里面的每个{}之内应有4个元素,但这个有5个元素

2.T_ULONGLONG是什么意思?

3. offsetof()返回的值有什么用呢?

4. 为啥这里的结尾标识符是{ nullptr, 0, 0, 0, nullptr }而不是传统的{NULL,NULL,0,NULL}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值