Cython:如何将 C++ class 导出为 .hpp header 而不是 C .h header
Cython: How to export C++ class to .hpp header instead of C .h header
这在 .pxd 文件中工作正常:
cdef public:
struct foo:
float bar
但这行不通:
cdef public:
class foo:
float bar # Syntax error in simple statement list
这有效,但 Cython 仍在制作 struct
而不是 class
,并且生成的文件是 .h 文件而不是 .hpp(或 .hh)文件:
cdef public:
cppclass foo:
float bar
我的文件名为 mod.pyx
,Cython 将上方的 cppclass
转译为:
#ifndef __PYX_HAVE__mod
#define __PYX_HAVE__mod
#include "Python.h"
struct foo;
struct foo {
/* "mod.pyx":21
*
* cdef public:
* cppclass foo: # <<<<<<<<<<<<<<
* float bar
*
*/
float bar;
};
如何从 Cython 转译中生成真正的 C++ 输出?我的意思是 .hpp 或 .hh 文件里面有 class
关键字。可以使用单独的 C++ header 文件来代替,但我想使源代码完全 Cython。
转译指令为:
cython3 -3 --cplus --fast-fail mod.pyx
我已经弄清楚如何仅在 Cython 中定义 C++ class(不是 Python 扩展类型 'class');它仍然被转译到 .h
文件 为 struct
但是 里面有方法 :
# Declaration
cdef public:
cppclass foo:
float bar
foo() # Constructor
method() # Sample method
# Implementation
cdef cppclass foo:
method():
cdef foo* p = this # 'this' can be used
print(p.bar+1) # Test
有一些注意事项:
- nullary 构造函数是必须的,Cython 是这么说的
- 这不需要构造函数:cdef foo* f = new foo()
- 这需要一个构造函数:cdef foo f = foo()
- 或错误:
no constructor found for C++ type 'foo'
- Python 中没有重载,适用于 Cython,因此没有构造函数重载(?);改为由方法设置的属性
这在 .pxd 文件中工作正常:
cdef public:
struct foo:
float bar
但这行不通:
cdef public:
class foo:
float bar # Syntax error in simple statement list
这有效,但 Cython 仍在制作 struct
而不是 class
,并且生成的文件是 .h 文件而不是 .hpp(或 .hh)文件:
cdef public:
cppclass foo:
float bar
我的文件名为 mod.pyx
,Cython 将上方的 cppclass
转译为:
#ifndef __PYX_HAVE__mod
#define __PYX_HAVE__mod
#include "Python.h"
struct foo;
struct foo {
/* "mod.pyx":21
*
* cdef public:
* cppclass foo: # <<<<<<<<<<<<<<
* float bar
*
*/
float bar;
};
如何从 Cython 转译中生成真正的 C++ 输出?我的意思是 .hpp 或 .hh 文件里面有 class
关键字。可以使用单独的 C++ header 文件来代替,但我想使源代码完全 Cython。
转译指令为:
cython3 -3 --cplus --fast-fail mod.pyx
我已经弄清楚如何仅在 Cython 中定义 C++ class(不是 Python 扩展类型 'class');它仍然被转译到 .h
文件 为 struct
但是 里面有方法 :
# Declaration
cdef public:
cppclass foo:
float bar
foo() # Constructor
method() # Sample method
# Implementation
cdef cppclass foo:
method():
cdef foo* p = this # 'this' can be used
print(p.bar+1) # Test
有一些注意事项:
- nullary 构造函数是必须的,Cython 是这么说的
- 这不需要构造函数:cdef foo* f = new foo()
- 这需要一个构造函数:cdef foo f = foo()
- 或错误:
no constructor found for C++ type 'foo'
- 或错误:
- Python 中没有重载,适用于 Cython,因此没有构造函数重载(?);改为由方法设置的属性