将#define与函数一起使用

时间:2013-05-15 17:41:30

标签: c c-preprocessor

在过去的几天里,我一直在阅读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()")

2 个答案:

答案 0 :(得分:2)

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), "|");
}

答案 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), "|");
}

整个函数,其中uv指针是函数的一部分。当然,没有括号安全,所以当传递“坏”值时,它会很容易被打破......