gpt4 book ai didi

python - SWIG 添加行以删除不存在的变量

转载 作者:太空宇宙 更新时间:2023-11-04 10:50:03 25 4
gpt4 key购买 nike

我有一个能够以普通 ASCII 或宽字符格式输出字符串的 C++ 类。我正在使用 SWIG(版本 3.0.5)为 Python 创建绑定(bind)。绑定(bind)必须在 Windows(32 位和 64 位)和 Linux(64 位)下工作。我写了一个自定义类型映射来从 Python 获取字符串到我的 C++ 类:/这个类型映射用于从 Python 获取字符串到 C++ 类

%typemap(in) const myNamespace::myStringType&
{
// Custom input conversion #7
const char* pChars = "";
PyObject* pyobj = $input;

if(PyString_Check(pyobj))
{
pChars = PyString_AsString( pyobj );
$1 = new myNamespace::myStringType( pChars );
}
else if (PyUnicode_Check( pyobj ))
{
PyObject* tmp = PyUnicode_AsUTF8String( pyobj );
pChars = PyString_AsString( tmp );
$1 = new myNamespace::myStringType( pChars );
}
else
{
std::string strTemp;
int rrr = SWIG_ConvertPtr(pyobj, (void **) &strTemp, $descriptor(String), 0);
if (!SWIG_IsOK(rrr))
SWIG_exception_fail(SWIG_ArgError(rrr), "Expected a String "
"in method '$symname', argument $argnum of type '$type'");
$1 = new myNamespace::myStringType( strTemp );
}
}

此类型映射适用于 32 位和 64 位普通字符构建,但当我尝试构建宽字符时出现问题。在宽字符构建中,我需要在我的接口(interface)文件中包含以下 SWIG 包含文件:

%include "std_wiostream.i"
%include "std_wsstream.i"

当这些包含文件与上述类型映射一起使用时,我们会像这样将虚假代码行插入到包装器中:

if (SWIG_IsNewObj(res2)) delete arg2;

这是一个由 SWIG 生成的完整包装函数的示例:

SWIGINTERN PyObject *_wrap_timeStampFromStr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
myNamespace::myStringType *arg1 = 0 ;
PyObject * obj0 = 0 ;
slx::SlxU64 result;

if (!PyArg_ParseTuple(args,(char *)"O:timeStampFromStr",&obj0)) SWIG_fail;
{
// Custom input conversion #7
const char* pChars = "";
PyObject* pyobj = obj0;

if(PyString_Check(pyobj))
{
pChars = PyString_AsString( pyobj );
arg1 = new myNamespace::myStringType( pChars );
}
else if (PyUnicode_Check( pyobj ))
{
PyObject* tmp = PyUnicode_AsUTF8String( pyobj );
pChars = PyString_AsString( tmp );
arg1 = new myNamespace::myStringType( pChars );
}
else
{
std::string strTemp;
int rrr = SWIG_ConvertPtr(pyobj, (void **) &strTemp, SWIGTYPE_String, 0);
if (!SWIG_IsOK(rrr))
SWIG_exception_fail(SWIG_ArgError(rrr), "Expected a String "
"in method 'timeStampFromStr', argument 1 of type 'myNamespace::myStringType const &'");
arg1 = new myNamespace::myStringType( strTemp );
}
}
result = (slx::SlxU64)slx::timeStampFromStr((std::basic_string< char,std::char_traits< char >,std::allocator< char > > const &)*arg1);
resultobj = SWIG_From_unsigned_SS_long_SS_long(static_cast< unsigned long long >(result));
if (SWIG_IsNewObj(res2)) delete arg2;
return resultobj;
fail:
if (SWIG_IsNewObj(res2)) delete arg2;
return NULL;
}

代码无法编译,因为 res2 和 arg2 变量从未在包装代码中定义。

如果我省略 SWIG 包含,额外的代码行将消失,但我将无法获得我需要的对宽字符 iostream 的支持。

目前的解决方法是手动删除这些代码行,但显然这不适用于 Windows 中的自动构建和 Linux 中的 Makefile。

有人知道为什么会这样吗?我相信我的类型映射中一定有一个错误,它会产生额外的代码行,但同样,这只有在包含宽字符 iostream 的 SWIG 包含文件时才会发生。

任何想法将不胜感激。提前致谢。

最佳答案

我对 string const & 也有同样的问题,似乎 Swig 从 std_string.i 添加了一个错误的 freearg 语句。解决方法是覆盖错误添加的删除:

%typemap(freearg) string const & {}
%typemap(freearg) const myNamespace::myStringType& {}

关于python - SWIG 添加行以删除不存在的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31342621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com