18

我正在尝试使用 SWIG 将此函数公开给 Python:

std::vector<int> get_match_stats();

我希望 SWIG 为 Python 生成包装代码,以便我可以将其视为整数列表。

将此添加到 .i 文件中:

%包括“typemaps.i”
%包括“std_vector.i”

命名空间标准
{
  %template(IntVector) 向量<int>;
}

我正在跑步SWIG Version 1.3.36并与 swig 通话-Wall,但没有收到任何警告。

我能够访问一个列表,但是在使用-Wall(with 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:警告:取消引用类型双关指针将破坏严格的别名规则
4

2 回答 2

14
%template(IntVector) vector<int>;
于 2008-11-10T11:44:15.637 回答
0

我对 Swig 没有太多经验,但是您是否在 .i 文件中包含您的 C++ 头文件?尝试其中一种(或两种)

%include "myvector.h"


%{
#   include "myvector.h"
%}
于 2008-12-15T16:40:34.130 回答