1. 程式人生 > >『Python CoolBook』C擴展庫_其五_C語言層面Python庫之間調用API(待續)

『Python CoolBook』C擴展庫_其五_C語言層面Python庫之間調用API(待續)

新的 c庫 ati .com 創建 結構 指針 內存 point

技術分享圖片

一、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(待續)