Поэтому мне нужно было использовать код модуля подпроцесса, чтобы добавить некоторые необходимые мне функции. Когда я пытался скомпилировать файл _subprocess.c, это дает сообщение об ошибке:Расширения Python с C: staticforward
Error 1 error C2086: 'PyTypeObject sp_handle_type' : redefinition
Это часть кода, которая имеет отношение с _subprocess.c
файла:
typedef struct {
PyObject_HEAD
HANDLE handle;
} sp_handle_object;
staticforward PyTypeObject sp_handle_type;
static PyObject*
sp_handle_new(HANDLE handle)
{
sp_handle_object* self;
self = PyObject_NEW(sp_handle_object, &sp_handle_type);
if (self == NULL)
return NULL;
self->handle = handle;
return (PyObject*)self;
}
#if defined(MS_WIN32) && !defined(MS_WIN64)
#define HANDLE_TO_PYNUM(handle) PyInt_FromLong((long) handle)
#define PY_HANDLE_PARAM "l"
#else
#define HANDLE_TO_PYNUM(handle) PyLong_FromLongLong((long long) handle)
#define PY_HANDLE_PARAM "L"
#endif
static PyObject*
sp_handle_detach(sp_handle_object* self, PyObject* args)
{
HANDLE handle;
if (!PyArg_ParseTuple(args, ":Detach"))
return NULL;
handle = self->handle;
self->handle = INVALID_HANDLE_VALUE;
/* note: return the current handle, as an integer */
return HANDLE_TO_PYNUM(handle);
}
static PyObject*
sp_handle_close(sp_handle_object* self, PyObject* args)
{
if (!PyArg_ParseTuple(args, ":Close"))
return NULL;
if (self->handle != INVALID_HANDLE_VALUE) {
CloseHandle(self->handle);
self->handle = INVALID_HANDLE_VALUE;
}
Py_INCREF(Py_None);
return Py_None;
}
static void
sp_handle_dealloc(sp_handle_object* self)
{
if (self->handle != INVALID_HANDLE_VALUE)
CloseHandle(self->handle);
PyObject_FREE(self);
}
static PyMethodDef sp_handle_methods[] = {
{ "Detach", (PyCFunction)sp_handle_detach, METH_VARARGS },
{ "Close", (PyCFunction)sp_handle_close, METH_VARARGS },
{ NULL, NULL }
};
static PyObject*
sp_handle_getattr(sp_handle_object* self, char* name)
{
return Py_FindMethod(sp_handle_methods, (PyObject*)self, name);
}
static PyObject*
sp_handle_as_int(sp_handle_object* self)
{
return HANDLE_TO_PYNUM(self->handle);
}
static PyNumberMethods sp_handle_as_number;
statichere PyTypeObject sp_handle_type = {
PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"_subprocess_handle", sizeof(sp_handle_object), 0,
(destructor)sp_handle_dealloc, /*tp_dealloc*/
0, /*tp_print*/
(getattrfunc)sp_handle_getattr,/*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
&sp_handle_as_number, /*tp_as_number */
0, /*tp_as_sequence */
0, /*tp_as_mapping */
0 /*tp_hash*/
};`
Также я что:
#define staticforward static
#define statichere static
Я не понимаю, что я делаю неправильно. Любая помощь будет оценена по достоинству. Btw (я не уверен, что это актуально), я использую Visual Studio Professional 2013 для компиляции этого файла.
Этот файл (как и все остальные) должен скомпилировать _OOTB_. Я пробовал пару комбинаций (_VC2k10_ vs _Py27_ как, например,), но не смог воспроизвести проблему. Вы должны (искать дубликаты), и закрыть проблему. __Действительно, я не рассматриваю это как решение .__ – CristiFati
В Visual Studio 2013 вы не можете определить статическую переменную дважды. staticforward и statichere были оба определены как «статические», поэтому на самом деле ошибка является законной. Изменение staticforward на 'extern' сообщает компилятору, что переменная будет определена позже. – Omer
_ «В Visual Studio 2013 вы не можете определить статическую переменную дважды. Staticforward и statichere были defdeend как« static », поэтому на самом деле ошибка является допустимой». Это не может быть больше __wrong__. В любой версии компилятора _VStudio_ (или любой _VS_ или _C_) 'static' означает, что переменные видны только в модуле компиляции (_c_/_C++ _ file). Пожалуйста, ознакомьтесь с интернетом (_Google_, _MSDN_, _Wiki_, ... и тонны других). – CristiFati