在编译用c编写的python模块时,初始值设定项不是常量,错误为C2099
我试图在windows 10上使用msvc 2017编译一个名为c“python setup.py install--with-c”的python模块,但出现了以下错误 cddistance/distance.c(647):错误C2099:初始值设定项不是 不变的 cddistance/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行的代码在编译用c编写的python模块时,初始值设定项不是常量,错误为C2099,python,c,visual-c++,python-c-api,Python,C,Visual C++,Python C Api,我试图在windows 10上使用msvc 2017编译一个名为c“python setup.py install--with-c”的python模块,但出现了以下错误 cddistance/distance.c(647):错误C2099:初始值设定项不是 不变的 cddistance/distance.c(689):错误C2099:初始值设定项不是 不变的 错误:命令“C:\Program Files(x86)\Microsoft Visual Studio\ 2017\BuildTools\
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行是另一个类似strucure的
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);
感谢我找到了解决方案,通过查看PyTypeObject结构的定义,我通过
PyVarObject\u HEAD\u INIT(NULL,0)
更改了yVarObject\u HEAD\u INIT(&PyType\u Type,0)
并成功编译了它,我尝试了一些函数,它工作正常,所以这个错误是由&PyType\u Type
引起的,它是一个PyObject*
,我知道因为IFastComp\u Type
是一个全局变量,它应该由一个常量初始化,但我仍然不知道为什么模块的作者给出了&PyType\u Type
作为参数,谢谢大家的评论。我找到了解决方案,通过查看PyTypeObject结构的定义,我已经通过PyVarObject\u HEAD\u INIT(&PyType\u Type,0)
修改了PyVarObject\u HEAD\u INIT(NULL,0)
并成功编译了它,我已经尝试了一些函数,它工作了,所以这个错误是由&PyType\u Type
引起的,它是一个PyObject*
,我知道因为如果stcomp\u Type
是一个全局变量,它应该由一个常量初始化,但我仍然不知道为什么模块的作者给出了&PyType\u Type
作为参数,谢谢大家的评论。请参阅
这条线有点粗糙;我们想写的是:
PyVarObject\u HEAD\u INIT(&PyType\u Type,0)
因为类型对象的类型是“type”,但这不是严格符合C的,一些编译器抱怨。幸运的是,这个成员将由PyType\u Ready()
为我们填写
我假设Visual C是投诉的编译器,并且该模块是用GCC编写和测试的…请参见
这条线有点粗糙;我们想写的是:
PyVarObject\u HEAD\u INIT(&PyType\u Type,0)
因为类型对象的类型是“type”,但这不是严格符合C的,一些编译器抱怨。幸运的是,这个成员将由PyType\u Ready()
为我们填写
我假设VisualC是抱怨的编译器,模块是用GCC编写和测试的…这一行“第647行”有很多行。哪个是647,哪个是689?你知道如何初始化全局变量吗?其中一个符号不是常量。发现哪一个,你就完成了。如果您不知道如何购买一本好的C语言书,因为我们不是免费的学习服务,
ifast\u comp\u doc
是如何声明的?(我只是把它与我们在C++中编写的Python类进行了比较。我看不出有什么明显的错误。)我按照ALK的建议编辑了它,是的,当然我是用一个常数来做的,但是我没有找出哪一个,@ PTERJ:<代码> const <代码>在C中不创建常数。这行“行647”是多行。哪个是647,哪个是689?你知道如何初始化全局变量吗?其中一个符号不是常量。发现哪一个,你就完成了。如果您不知道如何购买一本好的C语言书,因为我们不是免费的学习服务,ifast\u comp\u doc
是如何声明的?(我只是把它与我们在C++中编写的Python类进行比较。我看不出明显的错误。)我按照ALK的建议编辑了它,是的,当然我是用一个常数来做的,但是我没有弄清楚是哪一个,@ PTERJ:<代码> const 不在C中创建一个常量。我不知道一致性。我认为VC在这里的表现不够正确——我引用的是Python文档,而不是声称理解C标准。听起来VC在这里是错误的,但是使用PythonC接口的标准方法是编写VC可以处理的代码。编写PyVarObject\u HEAD\u INIT(NULL,0)
很有帮助。我不确定是否符合要求,我认为VC在这里的行为不够公正-我引用的是Python文档,而不是声称理解C标准。听起来VC在这里是错误的,但是使用PythonC接口的标准方法是编写VC可以处理的代码。写入PyVarObject\u HEAD\u INIT(NULL,0)
有帮助。
PyVarObject_HEAD_INIT(NULL, 0)