感谢 swig,我想将一些 C++ 代码绑定到 python。在我的 C++ 代码中,我通过类方法初始化了一些重要的变量。但是,这种初始化似乎给 swig which return 带来了一些麻烦Error: Syntax error - possibly a missing semicolon.
下面是从 swig 文档中提取的一个非常简单的示例,其中我只从方法中添加了这种初始化。此示例由 3 个文件 ( my_class.hpp
; my_class.cpp
; py_myclass.i
) 组成。
my_class.hpp:
#ifndef MYCLASS_H
#define MYCLASS_H
class MyClass {
public:
float getSqr();
float getSqr(float _v);
private:
float value=2.;
};
float toto=MyClass().getSqr(3.); // the only line I added !
#endif
my_class.cpp
#include "my_class.hpp"
float MyClass::getSqr() {
return getSqr(value);
}
float MyClass::getSqr(float value) {
return value*value;
}
py_myclass.i
%module py_myclass
%{
#include "my_class.hpp"
%}
%include "my_class.hpp"
因此,我对 swig 文档所做的唯一修改是添加了初始化行float toto=MyClass().getSqr(3.);
。我试着玩了一下,但我总是遇到语法错误。
从这些文件中,我执行 swig 来创建包装器。我用命令行来做:
swig -python -c++ -o py_myclass_wrap.cpp py_myclass.i
这产生了以下错误:
py_myclass.i:13: Error: Syntax error - possibly a missing semicolon.
那么,有没有办法用 swig 完成这种初始化?
我还尝试在文件%ignore toto;
的最后一行之前添加该行,但似乎忽略本身就被忽略了。%include "my_class.hpp"
py_myclass.i
SWIG 的 C++ 解析器似乎不支持该初始化语法。
相反,在标题中使用:
extern float toto;
在 .cpp 文件中初始化它:
float toto=MyClass().getSqr(3.);
然后 SWIG 将只看到 extern 声明,因为它只解析 .hpp 文件。这是结果的运行:
>>> import py_myclass
>>> py_myclass.cvar.toto
9.0
>>> c=py_myclass.MyClass()
>>> c.getSqr()
4.0
>>> c.getSqr(9)
81.0
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句