代码之家  ›  专栏  ›  技术社区  ›  R. N

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

  •  0
  • R. N  · 技术社区  · 2 年前

    多亏了swig,我想把一些C++代码绑定到python上。 在我的C++代码中,我通过类方法初始化一些重要的变量。 然而,这种初始化似乎给返回的swig带来了一些麻烦 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。我

    %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。我 ,但似乎忽略了它本身。

    0 回复  |  直到 2 年前
        1
  •  1
  •   Mark Tolonen    2 年前

    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