1

次のコードスニペットを見たときに、Python用のC拡張機能の作成について学習しようとしているため、ファイルmethodobject.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に外部から渡されたポインター)を受け取る関数です。ただし、me​​thとselfがスタックに割り当てられているように見えるため、PyCFunctionCallが終了すると解放され、渡される変数に問題が発生します。

ここで何が欠けていますか?

4

3 に答える 3

4

meth関数ポインタです。関数の結果*meth(methが指すアドレス)を引数とともに返します: (self, arg);

于 2012-05-11T16:18:39.403 に答える
3

meth(self, arg)それ自体ではなく、の戻り値を返しますmeth。ポインタを。で派生させてから、その場所の関数に(*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 に答える