在C/Python documentation中,我找到了。
首先,定义函数:
static PyObject *
keywdarg_parrot(PyObject *self, PyObject *args, PyObject *keywds)
{
// Some code here.
}
然后,像这样的演员:
(PyCFunction)(void(*)(void))keywdarg_parrot
其中,引用:
[
PyCFunction
值仅需要两个PyObject*
参数,而keywdarg_parrot()
需要三个参数。
此转换的三个问题:
keywdarg_parrot
的参数强制转换为void(*)(void)
?您可以将函数指针强制转换为其他类型的函数指针,但是如果要调用它,则必须将其强制返回。只要是存储函数指针或将其传递,就没有问题。在这种情况下,必须进行强制转换以将函数指针存储在PyMethodDef
结构中。该结构还包含一个字段,用于标识该函数使用的调用约定。在这种情况下,该函数被标记为
METH_VARARGS | METH_KEYWORDS
,其中METH_KEYWORDS
标志保证该函数采用三个参数。
这在您链接的同一文档的第1.4节中进行了说明。
我没有中间演员的解释。看起来有人通过类推推理,将指针转换强制转换为void*
,这仅在C ++中是必需的。但是afaik,C ++并不限制函数指针的强制转换。也许某些编译器会发出警告。