在 SWIG > 2.0.1 中相同的枚举项包装在不同类型的常量中
The same enumeration items wraps in a constants of different types in SWIG > 2.0.1
我在 SWIG 3.0.12 中发现了一个小错误。如果你在文件 examples/python/enum/example.h 中做很少的改动,只需将一个 char 常量添加到枚举项 (g):
enum color { RED, BLUE, GREEN = 'g'};
然后做一个换行,编译_example.so和运行$python runme.py
,你会得到:
enter code here
*** color ***
RED = 0
BLUE = 1
GREEN = g
*** Foo::speed ***
Foo_IMPULSE = 0
Foo_WARP = 1
Foo_LUDICROUS = 2
Testing use of enums with functions
color = RED, speed = IMPULSE speed
color = BLUE, speed = WARP speed
Traceback (most recent call last):
File "runme.py", line 22, in <module>
example.enum_test(example.GREEN, example.Foo.LUDICROUS)
TypeError: in method 'enum_test', argument 1 of type 'color'
情况很奇怪,不是吗?相同的枚举项包装在不同类型的常量中,可怜的小函数只等待一种类型的枚举常量(现在它等待 int,但 GREEN 常量类型是 char)。如何在不回滚SWIG版本的情况下绕过,你怎么看?
此错误出现在 SWIG 3.0.12、3.0.11 中,但在 2.0.1 中一切正常。
好的,这是 6 年前出现的一个旧 SWIG 错误,当时 SWIG 开发人员添加了不同类型的枚举功能。可能他们忘记了 PHP 和 Python 等动态类型语言,我不知道,但对我来说,这个问题通过编译我自己的 SWIG 构建并更改解析器源代码来解决......
只需在 Source/CParse/parser.y
之后添加 if 条件:
5620 5620 Swig_error(cparse_file,cparse_line,"Type error. Expecting an integral type\n");
5621 5621 }
5622 - if ($$.type == T_CHAR) $$.type = T_INT;
5623 5622 }
5624 5623 ;
然后用这个小改动构建你自己的 SWIG,你将把所有枚举项目包装成整数常量。
我在 SWIG 3.0.12 中发现了一个小错误。如果你在文件 examples/python/enum/example.h 中做很少的改动,只需将一个 char 常量添加到枚举项 (g):
enum color { RED, BLUE, GREEN = 'g'};
然后做一个换行,编译_example.so和运行$python runme.py
,你会得到:
enter code here
*** color ***
RED = 0
BLUE = 1
GREEN = g
*** Foo::speed ***
Foo_IMPULSE = 0
Foo_WARP = 1
Foo_LUDICROUS = 2
Testing use of enums with functions
color = RED, speed = IMPULSE speed
color = BLUE, speed = WARP speed
Traceback (most recent call last):
File "runme.py", line 22, in <module>
example.enum_test(example.GREEN, example.Foo.LUDICROUS)
TypeError: in method 'enum_test', argument 1 of type 'color'
情况很奇怪,不是吗?相同的枚举项包装在不同类型的常量中,可怜的小函数只等待一种类型的枚举常量(现在它等待 int,但 GREEN 常量类型是 char)。如何在不回滚SWIG版本的情况下绕过,你怎么看?
此错误出现在 SWIG 3.0.12、3.0.11 中,但在 2.0.1 中一切正常。
好的,这是 6 年前出现的一个旧 SWIG 错误,当时 SWIG 开发人员添加了不同类型的枚举功能。可能他们忘记了 PHP 和 Python 等动态类型语言,我不知道,但对我来说,这个问题通过编译我自己的 SWIG 构建并更改解析器源代码来解决......
只需在 Source/CParse/parser.y
之后添加 if 条件:
5620 5620 Swig_error(cparse_file,cparse_line,"Type error. Expecting an integral type\n");
5621 5621 }
5622 - if ($$.type == T_CHAR) $$.type = T_INT;
5623 5622 }
5624 5623 ;
然后用这个小改动构建你自己的 SWIG,你将把所有枚举项目包装成整数常量。