1

ここ数日、Python のソース コードをざっと読んでいて、わからないことがありました。「abstract.c」ファイルで、以下のコード スニペットを見つけました。それがどのように機能するかを理解したつもりでしたが、 と がどこから来たのか見当がつかないことに気付きまし*v*w。誰かがこのコードで何が起こっているのかを説明し、それをどのように使用するかの例を教えてください。

#define BINARY_FUNC(func, op, op_name) \
    PyObject * \
    func(PyObject *v, PyObject *w) { \
        return binary_op(v, w, NB_SLOT(op), op_name); \
}

BINARY_FUNC(PyNumber_Or, nb_or, "|")
BINARY_FUNC(PyNumber_Xor, nb_xor, "^")
BINARY_FUNC(PyNumber_And, nb_and, "&")
BINARY_FUNC(PyNumber_Lshift, nb_lshift, "<<")
BINARY_FUNC(PyNumber_Rshift, nb_rshift, ">>")
BINARY_FUNC(PyNumber_Subtract, nb_subtract, "-")
BINARY_FUNC(PyNumber_Divmod, nb_divmod, "divmod()")
4

2 に答える 2

2

vおよびwはマクロ パラメーターではなく、展開のリテラル部分です。マクロは関数定義に展開され、関数はパラメーターを受け取ります。パラメーターは常に and という名前vw、型は ですPythonObject *。例えば:

BINARY_FUNC(PyNumber_Or, nb_or, "|")

次のように展開します。

PythonObject *
PyNumber_Or(PyObject *v, PyObject *w) {
    return binary_op(v, w, NB_SLOT(nb_or), "|");
}
于 2013-05-15T17:52:04.867 に答える
0
#define BINARY_FUNC(func, op, op_name) \
PyObject * \
func(PyObject *v, PyObject *w) { \
    return binary_op(v, w, NB_SLOT(op), op_name); \
}

BINARY_FUNC(PyNumber_Or, nb_or, "|")

上記BINARY_FUNCに含めた定義は、次のように拡張されます。

PyObject *PyNumber_Or(PyObject *v, PyObject *w) { 
    return binary_op(v, w, NB_SLOT(nb_or), "|");
}

uおよびvポインターが関数の一部である関数全体。もちろん、括弧の安全性はありませんので、「悪い」値を渡すと簡単に壊れてしまいます...

于 2013-05-15T17:51:24.083 に答える