2013-05-15 72 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

@Barmar,你應該做出答案。 –

+0

它與通常定義一個函數沒有區別:'int f(int x,int y){return x * y;}}'。 'x'和'y'僅爲此功能定義。爲了充分解釋發生了什麼,你必須讓我們知道'binary_op'和'NB_SLOT'是如何定義的。 – jerry

回答

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

啊,呃。我不知道爲什麼我以前沒有看到。謝謝! – 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的認定中我上面包括擴展爲:

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

一整函數,其中uv指針功能的一部分。當然,沒有括號的安全性,因此當傳遞「不好」值時很容易中斷...