『Python CoolBook』C擴展庫_其五_C語言層面Python庫之間調用API(待續)
阿新 • • 發佈:2018-05-25
新的 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(待續)