You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Cython中调用返回不透明结构体的C函数遇None问题及类型问询

问题解答

问题1:为什么得到None?

你得到None完全是因为Cython里的函数声明错误——你把myCfunction声明成了void类型,Cython会自动将C语言中返回void的函数映射为Python的None。这和原C函数实际有没有返回值无关,原函数确实返回结构体指针,但你的错误声明让Cython丢弃了这个返回值,只返回None给Python。

问题2:不知结构体成员时该用什么返回类型?

既然你不需要访问结构体内部数据,只需要传递指针,直接用不透明指针处理就行,不需要知道结构体的具体成员。具体操作如下:

  1. 在Cython的.pyx文件中正确声明不透明结构体和函数:
cdef extern from "myClib.h":
    # 空的结构体声明,告诉Cython这是一个不透明类型
    ctypedef struct myCStruct:
        pass
    # 正确声明myCfunction的返回类型为结构体指针
    myCStruct* myCfunction()
    # 同时声明需要接收该指针的其他C函数(示例)
    void myOtherCFunction(myCStruct* struct_ptr)
  1. 封装Python可调用的函数:
def py_myCfunction():
    cdef myCStruct* struct_ptr = myCfunction()
    # Cython会自动把这个不透明指针包装成Python对象返回
    return struct_ptr

def py_myOtherCFunction(struct_obj):
    # 接收之前返回的对象,转换回C指针后调用C函数
    cdef myCStruct* struct_ptr = <myCStruct*>struct_obj
    myOtherCFunction(struct_ptr)

这样处理后,py_myCfunction返回的对象可以直接传递给其他封装的C函数,完全不需要关心结构体内部的具体成员。

内容的提问来源于stack exchange,提问作者bloub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:55:25