如何从使用 Swig 绑定 C++ 的类方法初始化变量

R.N

感谢 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章