通过结构体成员拿到结构体的指针,是C语言实现继承多态的基础。面向对象C编程可以参看这里OOC 面向对象C语言编程实践。这里详细介绍这个核心的操作方法。
/**
* Get struct pointer from member pointer
*/
#define StructFrom2(memberPtr, structType) \
((structType*) ((char*) memberPtr - offsetof(structType, memberPtr)))
下面给出一个使用的例子。
typedef struct Drawable Drawable;
struct Drawable
{
float positionX;
float positionY;
};
typedef struct Sprite Sprite;
struct Sprite
{
Drawable drawable[1];
};
Sprite sprite[1];
Drawable* drawable = sprite->drawable;
Sprite* sprite = StructFrom2(drawable, Sprite);
我们需要传入成员变量的地址和结构体类型。这样,首先使用offsetof标准库函数,获得这个成员变量的偏移量。在利用成员变量指针减去这个偏移量,就拿到了这个结构体对象的地址。这里有两个注意的地方。
第一,这里成员变量的名称,要和成员指针名字一致。因为offsetof参数需要的是成员变量名字。例子中drawable