今天在看代码时遇到下面的用法
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}