『Python CoolBook』C扩展库_其五_C语言层面Python库之间调用API(待续)

一、C层面模块添加API

我们仍然操作如下结构体,

#include <math.h>

typedef struct Point {
    double x,y;
} Point;

本节目标是封装两个Point结构体的操作函数为sample库的C级API,可以被sample以外的C库调用,首先写出以下函数指针结构体实例,

/* pysample.c */

static PyObject *PyPoint_FromPoint(Point *p, int must_free) {
  /* 胶囊和C指针类似。在内部,它们获取一个通用指针和一个名称,可以使用 
     PyCapsule_New() 函数很容易的被创建。 另外,一个可选的析构函数能被
     绑定到胶囊上,用来在胶囊对象被垃圾回收时释放底层的内存*/
  return PyCapsule_New(p, "Point", must_free ? del_Point : NULL);
}

/* Utility functions */
static Point *PyPoint_AsPoint(PyObject *obj) {
  return (Point *) PyCapsule_GetPointer(obj, "Point");
}

static _PointAPIMethods _point_api = {
  PyPoint_AsPoint,
  PyPoint_FromPoint
};

结构体定义如下,位于一个新的头函数中

/* pysample.h */

/* Public API Table */
/* 这里最重要的部分是函数指针表 _PointAPIMethods.
   它会在导出模块时被初始化,然后导入模块时被查找到。 */
typedef struct {
  Point *(*aspoint)(PyObject *);
  PyObject *(*frompoint)(Point *, int);
} _PointAPIMethods;

猜你喜欢

转载自www.cnblogs.com/hellcat/p/9089723.html
今日推荐