最近几天,我一直在阅读kicks的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()")
最佳答案
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), "|");
}
关于c - 对函数使用#define,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16571579/