编译randommodule.c遇Random_Type重定义错误,求解决方案
解决
Random_Type重定义编译错误 问题分析
编译_randommodule.c时触发错误:
error: redefinition of 'Random_Type'
问题根源是同一个编译单元中存在两个针对Random_Type的声明/定义:
- 一处是文件顶部的暂定定义:
static PyTypeObject Random_Type; - 另一处是代码后方的完整定义(带初始化结构体):
static PyTypeObject Random_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_random.Random", /*tp_name*/ sizeof(RandomObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ /* methods */ 0, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ PyObject_GenericGetAttr, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ random_doc, /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ random_methods, /*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*/ 0, /*tp_alloc*/ random_new, /*tp_new*/ _PyObject_Del, /*tp_free*/ 0, /*tp_is_gc*/ };
同时random_new函数需要引用Random_Type的地址做判断:
static PyObject * random_new(PyTypeObject *type, ...) { if (type == &Random_Type) return NULL; ... }
由于结构体定义依赖random_new函数指针,无法通过调换代码顺序消除冲突。
解决方案
执行以下两步操作即可解决:
- 删除文件顶部的暂定定义:移除
static PyTypeObject Random_Type;这行重复代码。 - 在
random_new函数前添加前向声明:在random_new的定义上方添加一行前向声明,保证函数能识别Random_Type:static PyTypeObject Random_Type;
原理说明
- 前向声明仅告诉编译器
Random_Type是一个静态的PyTypeObject类型变量,不需要分配存储空间,满足random_new中取地址的需求。 - 后方的完整定义是唯一的变量定义,编译器会为其分配存储空间并初始化结构体,不会触发重定义错误。
内容的提问来源于stack exchange,提问作者jackw11111
相关产品推荐
相关产品推荐

