如何从 class 绑定 C++ 和 Swig 的方法初始化变量
How to initialize a variable from a class method binding C++ with Swig
感谢 swig,我想将一些 C++ 代码绑定到 python。
在我的 C++ 代码中,我通过 class 方法初始化了一些重要的变量。
然而,这种初始化似乎给 swig which returns 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 完成这种初始化?
我也尝试在文件 py_myclass.i
中的最后一个 %include "my_class.hpp"
之前添加行 %ignore toto;
,但似乎忽略本身被忽略了。
SWIG 的 C++ 解析器似乎不支持该初始化语法。
相反,在 header 中使用:
extern float toto;
在 .cpp 文件中对其进行初始化:
float toto=MyClass().getSqr(3.);
然后 SWIG 将只看到外部声明,因为它只解析 .hpp 文件。这是结果的 运行:
>>> import py_myclass
>>> py_myclass.cvar.toto
9.0
>>> c=py_myclass.MyClass()
>>> c.getSqr()
4.0
>>> c.getSqr(9)
81.0
感谢 swig,我想将一些 C++ 代码绑定到 python。
在我的 C++ 代码中,我通过 class 方法初始化了一些重要的变量。
然而,这种初始化似乎给 swig which returns 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 完成这种初始化?
我也尝试在文件 py_myclass.i
中的最后一个 %include "my_class.hpp"
之前添加行 %ignore toto;
,但似乎忽略本身被忽略了。
SWIG 的 C++ 解析器似乎不支持该初始化语法。
相反,在 header 中使用:
extern float toto;
在 .cpp 文件中对其进行初始化:
float toto=MyClass().getSqr(3.);
然后 SWIG 将只看到外部声明,因为它只解析 .hpp 文件。这是结果的 运行:
>>> import py_myclass
>>> py_myclass.cvar.toto
9.0
>>> c=py_myclass.MyClass()
>>> c.getSqr()
4.0
>>> c.getSqr(9)
81.0