2013-05-15 7 views
1

저는 지난 며칠 동안 파이썬 소스 코드를 읽었으며 이해하지 못한 것을 발견했습니다. "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

, 그들은 매크로 확장 단지 문자 부품 위치 :

BINARY_FUNC(PyNumber_Or, nb_or, "|") 

는로 확장합니다. 그것들은 정의되는 함수의 매개 변수에 주어진 이름입니다. – Barmar

+0

@Barmar, 답을해야합니다. –

+0

일반적으로 함수를 정의하는 것과 다르지 않습니다.'int f (int x, int y) {return x * y;)}'. 'x'와'y'는이 함수에 대해서만 정의됩니다. 무슨 일이 벌어지고 있는지 완전히 설명하기 위해서는'binary_op'과'NB_SLOT' 정의 방법을 알려줘야합니다. – jerry

답변

2

v 및 은 매크로 매개 변수가 아니며 문자 그대로 확장됩니다. 매크로는 함수 정의로 확장되며 함수는 매개 변수를 사용합니다. 매개 변수는 항상 vw이며, 유형은 PythonObject *입니다. 예를 들어 : 그들은 어디에서 오지 않는

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

I 상기 포함 된 BINARY_FUNC 해상력이 펼쳐지 :

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

uv 포인터 기능의 일부, 전체 기능. 물론 괄호 안 안전성이 없으므로 "나쁜"값을 전달할 때 깨지기 쉬울 것입니다 ...