2013-05-15 3 views
1

Я читал исходный код Python за последние пару дней, и я наткнулся на то, что я не понял. В файле abstract.c я нашел приведенный ниже фрагмент кода. Я думал, что понял, как это работает, но потом я понял, что понятия не имею, откуда берутся *v и *w. Может кто-нибудь объяснить, что происходит в этом коде, и пример того, как вы его используете?Использование #define с функциями

#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

Они не приходят в любом месте, они просто буквальные части макроподстановок. Это имена, заданные параметрам определяемых функций. – Barmar

+0

@ Бармар, вы должны сделать ответ. –

+0

Это не что иное, как обычно определение функции: 'int f (int x, int y) {return x * y;)}'. 'x' и' y' определены только для этой функции. Чтобы полностью объяснить, что происходит, вы должны сообщить нам, как определяются 'binary_op' и' NB_SLOT'. – jerry

ответ

2

v и w не являются макропараметрами, они являются буквальными частями расширения. Макрос расширяется в определение функции, а функция принимает параметры - они всегда называются v и w, и они имеют тип PythonObject *. Например:

BINARY_FUNC(PyNumber_Or, nb_or, "|") 

расширяется в:

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

Ahh, gotcha. Я не знаю, почему я этого раньше не видел. Спасибо! – janovak

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 Defination я включил выше расширяется:

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

Целая функция, где u и v указатели являются частью функции. Конечно, нет никакой скобки безопасности, поэтому было бы неплохо прорваться при прохождении «плохих» значений ...

Смежные вопросы