将函数投射到另一个具有C中不同数量参数的函数

问题描述 投票:0回答:1

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()需要三个参数。

此转换的三个问题:

  1. 如何用较少的参数将一个函数转换为另一个函数?我的意思是,多余的参数会发生什么?
  2. 为什么将keywdarg_parrot的参数强制转换为void(*)(void)
c++ c casting void-pointers cpython
1个回答
0
投票

您可以将函数指针强制转换为其他类型的函数指针,但是如果要调用它,则必须将其强制返回。只要是存储函数指针或将其传递,就没有问题。在这种情况下,必须进行强制转换以将函数指针存储在PyMethodDef结构中。该结构还包含一个字段,用于标识该函数使用的调用约定。在这种情况下,该函数被标记为 METH_VARARGS | METH_KEYWORDS,其中METH_KEYWORDS标志保证该函数采用三个参数。

这在您链接的同一文档的第1.4节中进行了说明。

我没有中间演员的解释。看起来有人通过类推推理,将指针转换强制转换为void*,这仅在C ++中是必需的。但是afaik,C ++并不限制函数指针的强制转换。也许某些编译器会发出警告。

© www.soinside.com 2019 - 2024. All rights reserved.