【发布时间】:2010-09-21 13:32:10
【问题描述】:
我正在尝试使用 SWIG 将此函数公开给 Python:
std::vector<int> get_match_stats();
我希望 SWIG 为 Python 生成包装代码,以便我可以将其视为整数列表。
将此添加到 .i 文件中:
%包括“typemaps.i” %包括“std_vector.i” 命名空间标准 { %template(IntVector) 向量我正在运行 SWIG Version 1.3.36 并使用 -Wall 调用 swig,但我没有收到任何警告。
我能够访问一个列表,但是在使用 -Wall(使用 g++ (GCC) 4.2.4)编译生成的 C++ 代码时收到一堆警告:
我是否正确地公开了函数?如果是这样,警告是什么意思?
这些是同一函数中违规行之前的行:
SWIGINTERN PyObject *_wrap_IntVector_erase__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *resultobj = 0; std::vector *arg1 = (std::vector *) 0 ; std::vector::iterator arg2 ; std::vector::iterator 结果; 无效 *argp1 = 0 ; 整数 res1 = 0 ; swig::PySwigIterator *iter2 = 0 ; 诠释 res2 ; PyObject * obj0 = 0 ; PyObject * obj1 = 0 ; if (!PyArg_ParseTuple(args,(char *)"OO:IntVector_erase",&obj0,&obj1)) SWIG_fail; res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0); 如果(!SWIG_IsOK(res1)){ SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_erase" "', 参数 ""1"" of type '" "std::vector *""'"); } arg1 = reinterpret_cast * >(argp1);这是有问题的行:
res2 = SWIG_ConvertPtr(obj1, SWIG_as_voidptrptr(&iter2), swig::PySwigIterator::descriptor(), 0);更多代码如下。
用g++ 4.2.4编译时产生的警告是:
swig_iss_wrap.cxx:在函数‘PyObject* _wrap_IntVector_erase__SWIG_0(PyObject*, PyObject*)’中: swig_iss_wrap.cxx:5885:警告:取消引用类型双关指针将破坏严格的别名规则【问题讨论】:
-
最近的 swig 版本仍会生成导致此类警告的代码。使用 -fno-strict-aliasing 让 g++ 毫无问题地接受 swig 包装器。