如何使用 SIP 将结构内的联合从 C++ 转换为 python?
How to translate a union inside a struct from c++ to python with SIP?
我回答了 解释了如何使用 SIP 将联合从 C++ 转换为 python(不自动支持联合)。
当我在现有结构中对联合使用这种类型的包装时,我在尝试使用 sip-install 构建时收到以下错误消息(我将 'wrapped_u' 重命名为 'u' 和 'test_u' 到 'type_u'):
error: field 'u' has incomplete type 'type_u'
和
note: forward declaration of ‘union type_u’
.
这是c++头文件:
struct myType{
enum {CHAR, INT, DOUBLE} tag;
union type_u{
/* tag = CHAR */
char char_value;
/* tag = INT */
int int_value;
/* tag = DOUBLE */
double double_value;
};
type_u u;
void print_my_type() const;
};
这是 SIP 文件:
struct myType{
enum tag {CHAR, INT, DOUBLE};
struct union_wrapper /PyName=type_u/
{
%TypeHeaderCode
#include <test_struct_union.h>
struct union_wrapper
{
union type_u u;
};
%End
// tag = CHAR
char char_value {
%GetCode
sipPy = PyUnicode_FromString(&(sipCpp->u.char_value));
%End
%SetCode
if (PyUnicode_Check(sipPy))
sipCpp->u.char_value;
else
sipErr = 1;
%End
};
// tag = INT
int int_value {
%GetCode
sipPy = PyLong_FromLong(sipCpp->u.int_value);
%End
%SetCode
if (PyLong_Check(sipPy))
sipCpp->u.int_value;
else
sipErr = 1;
%End
};
// tag = DOUBLE
double double_value {
%GetCode
sipPy = PyFloat_FromDouble(sipCpp->u.double_value);
%End
%SetCode
if (PyFloat_Check(sipPy))
sipCpp->u.double_value;
else
sipErr = 1;
%End
};
};
void print_my_type() const;
};
有人知道如何解决这个问题吗?
提前致谢!
强尼
自 Sip 版本 6.0.0 起支持联合。
感谢您快速集成 Riverbank Computing。
希望不再需要手动进行翻译。
我回答了
当我在现有结构中对联合使用这种类型的包装时,我在尝试使用 sip-install 构建时收到以下错误消息(我将 'wrapped_u' 重命名为 'u' 和 'test_u' 到 'type_u'):
error: field 'u' has incomplete type 'type_u'
和
note: forward declaration of ‘union type_u’
.
这是c++头文件:
struct myType{
enum {CHAR, INT, DOUBLE} tag;
union type_u{
/* tag = CHAR */
char char_value;
/* tag = INT */
int int_value;
/* tag = DOUBLE */
double double_value;
};
type_u u;
void print_my_type() const;
};
这是 SIP 文件:
struct myType{
enum tag {CHAR, INT, DOUBLE};
struct union_wrapper /PyName=type_u/
{
%TypeHeaderCode
#include <test_struct_union.h>
struct union_wrapper
{
union type_u u;
};
%End
// tag = CHAR
char char_value {
%GetCode
sipPy = PyUnicode_FromString(&(sipCpp->u.char_value));
%End
%SetCode
if (PyUnicode_Check(sipPy))
sipCpp->u.char_value;
else
sipErr = 1;
%End
};
// tag = INT
int int_value {
%GetCode
sipPy = PyLong_FromLong(sipCpp->u.int_value);
%End
%SetCode
if (PyLong_Check(sipPy))
sipCpp->u.int_value;
else
sipErr = 1;
%End
};
// tag = DOUBLE
double double_value {
%GetCode
sipPy = PyFloat_FromDouble(sipCpp->u.double_value);
%End
%SetCode
if (PyFloat_Check(sipPy))
sipCpp->u.double_value;
else
sipErr = 1;
%End
};
};
void print_my_type() const;
};
有人知道如何解决这个问题吗?
提前致谢!
强尼
自 Sip 版本 6.0.0 起支持联合。
感谢您快速集成 Riverbank Computing。
希望不再需要手动进行翻译。