初始化程序不是常量,错误C2099,编译用c编写的用于python的模块

我试图编译一个名为distance的python模块,在Windows 10上使用msvc 2017编译“python setup.py install –with-c”,我收到此错误,

Cdistance / distance.c(647):错误C2099:初始化器不是常量

Cdistance / distance.c(689):错误C2099:初始化器不是常量

错误:命令’C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ BuildTools \ VC \ Tools \ MSVC \ 14.10.25017 \ bin \ HostX64 \ x64 \ cl .exe’失败,退出状态为2

这是第647行的代码

646 PyTypeObject IFastComp_Type = { 647 PyVarObject_HEAD_INIT(&PyType_Type, 0) 648 "distance.ifast_comp", /* tp_name */ 649 sizeof(ItorState), /* tp_basicsize */ 650 0, /* tp_itemsize */ (destructor)itor_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ ifast_comp_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ PyObject_SelfIter, /* tp_iter */ (iternextfunc)ifastcomp_next, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ PyType_GenericAlloc, /* tp_alloc */ ifastcomp_new, /* tp_new */ }; 

在689行是另一个像结构,

 688 PyTypeObject ILevenshtein_Type = { 689 PyVarObject_HEAD_INIT(&PyType_Type, 0) "distance.ilevenshtein", /* tp_name */ sizeof(ItorState), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)itor_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ 0, /* tp_reserved */ 0, /* tp_repr */ 

两者在同一页面中引用如下

 762 if (PyType_Ready(&IFastComp_Type) != 0 || PyType_Ready(&ILevenshtein_Type)!= 0) 763 #if PY_MAJOR_VERSION >= 3 return NULL; #else return; #endif Py_INCREF((PyObject *)&IFastComp_Type); Py_INCREF((PyObject *)&ILevenshtein_Type); 

谢谢

我已经找到了解决方案,通过查看结构yVarObject_HEAD_INIT(&PyType_Type, 0)的定义,我已经通过PyVarObject_HEAD_INIT(NULL, 0)更改了yVarObject_HEAD_INIT(&PyType_Type, 0) PyVarObject_HEAD_INIT(NULL, 0)并且它成功编译,并且我尝试了一些函数并且它可以工作,所以错误是由&PyType_Type引起的&PyType_Type它是一个PyObject* ,我知道因为IFastComp_Type是一个全局变量,它应该由一个constante初始化,但我仍然不知道为什么模块的作者给出了&PyType_Type作为参数,谢谢大家你的评论。

请参阅“定义新类型”的文档 。

 PyVarObject_HEAD_INIT(NULL, 0) 

这条线有点疣; 我们想写的是:

PyVarObject_HEAD_INIT(&PyType_Type, 0)

因为类型对象的类型是“类型”,但这并不严格符合C并且一些编译器抱怨。 幸运的是, PyType_Ready()将为我们填写此成员。

我认为Visual C是抱怨的编译器,模块是用GCC编写和测试的……