python - 在 SWIG > 2.0.1 中相同的枚举项包装在不同类型的常量中

标签 python c++ enums 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,您将把所有枚举项目包装成整数常量。

关于python - 在 SWIG > 2.0.1 中相同的枚举项包装在不同类型的常量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45234201/

相关文章:

enums - 如何访问枚举变体未命名字段?

python - sqlalchemy 与 `len(query.all())` 和 `query.count()` 不同的值

python - 数据框 pandas 中的条件(NaN 列)和条件

python - 在 python 应用程序中发送和接收电子邮件(无 IMAP 或 POP3)

python - 如何根据pandas中的多列快速选择数据框

c++ - 从 QThread 循环发射信号

c# - 为什么 C# 编译器允许空枚举?

go - 如何在Golang中检查值是否为iota常量类型?

c++ - 如何在 C++ 中删除数组中小于 X 的整数?

c++ - Steamworks 检查用户是否登录