首页 > 编程语言 > 详细

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

时间:2018-05-25 19:03:11      阅读:222      评论:0      收藏:0      [点我收藏+]

技术分享图片

一、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;

 

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

原文:https://www.cnblogs.com/hellcat/p/9089723.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!