SWIG 无法正确转换 typedef 类型

Posted

技术标签:

【中文标题】SWIG 无法正确转换 typedef 类型【英文标题】:SWIG cannot convert typedef type correct 【发布时间】:2013-05-23 13:34:06 【问题描述】:

我正在使用 SWIT 将 vc 项目转换为 python。 我发现当结构具有类型为“typedef char TEXT [16]”的成员时无法正确转换。 例如:

typedef char TEXT[16];
struct MYSTRUCT
       
    TEXT    TradingDay;     
;

包装器 cpp 无法正常编译。 “错误 C2075:‘运算符 new() 的目标’:数组初始化需要大括号” 但是,如果 typedef 不是数组,像这样:

    typedef int NUMBER;
    struct MYSTRUCT2
       
    NUMBER Money;       
;

一切都会好的。 我该怎么办? 谢谢!

附注: 我的文件:

%module MyDataAPI
%include "typemaps.i"

%header %
#include "../References/MyDataAPI.h"

%

namespace MyDataAPI

     struct MYSTRUCT
           
        TEXT    TradingDay;     
    ;
    struct MYSTRUCT2
           
        NUMBER Money;       
    ;

【问题讨论】:

【参考方案1】:

确保您的 typedef 语句由 SWIG 处理。 %header 仅将代码添加到生成的文件中,SWIG 不处理该数据。 %inline 都将代码直接添加到生成的文件中 使用 SWIG 处理它。这是我的.i 文件:

%module x

%inline %
    typedef char TEXT[16];
    typedef int NUMBER;
    namespace MyDataAPI
    
        struct MYSTRUCT
        
            TEXT TradingDay;
        ;
        struct MYSTRUCT2
        
            NUMBER Money;
        ;
    
%

并使用:

T:\>py
Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import x
>>> a=x.MYSTRUCT()
>>> a.TradingDay
''
>>> a.TradingDay='ABCDEFGHIJKLMNOPQ'   # Note this is too long, 17 chars...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: in method 'MYSTRUCT_TradingDay_set', argument 2 of type 'char [16]'
>>> a.TradingDay='ABCDEFGHIJKLMNOP'
>>> a.TradingDay
'ABCDEFGHIJKLMNOP'
>>> b=x.MYSTRUCT2()
>>> b.Money
0
>>> b.Money=100
>>> b.Money
100

【讨论】:

以上是关于SWIG 无法正确转换 typedef 类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 swig 包装时避免“未使用的 typedef”警告

SWIG:映射 typedef 的数组

Typedef、Ruby 和 SWIG

使用 SWIG 在 Python 中访问 C++ typedef

使用 SWIG 围绕 C++ 的 Python 包装器。参数类型无法识别

Python SWIG:将 C++ 返回参数转换为返回值,并将原始 C++ 类型转换为 Python 类型