在过去的几天里,我一直在阅读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()")
答案 0 :(得分: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), "|");
}
答案 1 :(得分: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
指针是函数的一部分。当然,没有括号安全,所以当传递“坏”值时,它会很容易被打破......