Cython 不编译 void 函数 - "empty declarator"

Cython not compiling void function - "empty declarator"

我在 foo.cpp 中定义了一个非常简单的 c++ class:

class Foo
{
    int x;

public:
    Foo()
    {}

    Foo(int _x)
    : x ( _x )
    {}

    int getX() { return x; }

    void print()
    { std::cout << "Foo { " << x << "}" << std::endl; }
};

在尝试用 cython 包装它时,我使用以下声明创建了 foo.pxd

cdef extern from "foo.cpp":
    cdef cppclass Foo:
        Foo() except +
        Foo(int) except +
        int x
        int getX()
        void print()

但是,在尝试构建它并将其 cimport 放入我的 pyx 源文件时,它给了我以下编译错误:

Error compiling Cython file:
------------------------------------------------------------
...
    cdef cppclass Foo:
        Foo() except +
        Foo(int) except +
        int x
        int getX()
        void print()
            ^
------------------------------------------------------------

foo.pxd:9:13: Empty declarator

Error compiling Cython file:
------------------------------------------------------------
...
    cdef cppclass Foo:
        Foo() except +
        Foo(int) except +
        int x
        int getX()
        void print()
            ^
------------------------------------------------------------

foo.pxd:9:13: Syntax error in C variable declaration

我试图遵循 this tutorial,但它似乎对我不起作用。即使将其修改为 Foo::print 方法采用整数参数 y,并将 foo.pxd 更新为 void print(int),我也会得到完全相同的错误。

我可能做错了什么,为什么我会出现这种行为?

答案实际上很简单,但了解起来非常有用。成员本身的名字是问题所在,而不是我在 foo.pxd 中声明它的方式。鉴于 print 是一个内置的 python 函数,它似乎与之冲突;将名称更改为任何非内置 method/function/type 或关键字的名称应该可以解决问题。请注意,Python、Cython 和 C/C++ keywords/functions 都可能以相同的方式与此冲突。

@DavidW 的回答(我已接受)更简洁地阐明了问题。我的解决方案有效,但列出的解释无效。

问题不是 print 是一个内置的函数。没关系。您可以毫无问题地覆盖内置函数的名称。

list = 1  # perfectly valid code; (but may confuse future users)

问题是 print 是内置的 关键字 。这是因为 Cython 在读取 .pyx 时默认使用 Python 2 语法(暂时)。要解决此问题,请使用 language_level=3 compiler directive.

Cython 还可以在 Cython 中使用与 C/C++ 中不同的名称来修复此类名称冲突。你可以改用它

cdef extern from "foo.cpp":
    cdef cppclass Foo:
        ...
        void cpp_print "print"()

这意味着 Cython 中的 cpp_print 被转换为 C++ 中的 print