1

当我看到以下代码片段时,我正在阅读文件 methodobject.c,因为我正在尝试学习如何为 Python 制作 C 扩展:

PyObject *
PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw)
{
    PyCFunctionObject* f = (PyCFunctionObject*)func;
    PyCFunction meth = PyCFunction_GET_FUNCTION(func);
    PyObject *self = PyCFunction_GET_SELF(func);
    Py_ssize_t size;

    switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
    case METH_VARARGS:
        if (kw == NULL || PyDict_Size(kw) == 0)
           return (*meth)(self, arg);
        break;

我看的越多

    return (*meth)(self, arg);

我越是意识到我不明白。我认为它返回了一个指向 meth 的指针,它是一个函数,它接受 self(一个本地声明的指针)和 arg(一个从外部传递到 PyCFunctionCall 的指针)。但是,因为在我看来 meth 和 self 好像是在堆栈上分配的,所以一旦 PyCFunctionCall 退出,它们将被释放,这将导致它们传递给的任何变量出现问题。

我在这里想念什么?

4

3 回答 3

4

meth是一个函数指针。它使用参数返回函数的结果*meth(meth指向的地址)(self, arg)

于 2012-05-11T16:18:39.403 回答
3

它返回 的返回值meth(self, arg),而不是meth它本身。请注意,它使用 derferencing 指针(*meth),然后传入self并传递arg给该位置的函数。

所以meth(self, arg)将在return发生之前完全评估,并且不会返回任何堆栈变量。

编辑:当我说时meth(self, arg),我的意思是the_function_pointed_to_by_meth(self, arg)

于 2012-05-11T16:21:29.393 回答
2

(*meth)(self, arg)是一个函数调用

恰好函数指针是一个局部变量。return只是传递从通话中返回的任何内容。

函数指针语法令人困惑。:)

于 2012-05-11T16:26:01.490 回答