最近几天,我一直在阅读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()")

最佳答案

vw不是宏参数,它们是扩展的文字部分。宏扩展为函数定义,函数接受参数——它们总是被命名为vw,并且是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/

10-13 03:38