【问题标题】:Cython not compiling void function - "empty declarator"Cython 未编译 void 函数 - “空声明符”
【发布时间】:2021-10-01 00:07:09
【问题描述】:

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

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),我也会得到同样的错误。

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

【问题讨论】:

  • 我建议将您的解决方案作为答案发布,而不是将其包含在问题中。 (是的,您可以回答自己的问题。)
  • 我知道,我只是不确定它是否值得,但我会这样做@KeithThompson
  • 我不认为这是stackoverflow.com/questions/8882649/…的完全重复,但它非常接近

标签: python c++ cython python-c-api


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    问题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

    【讨论】:

    • 我不知道它默认为 2.x,而且我知道 language_level 存在,但我不确定它的功能/用途是什么,谢谢,我得研究一下!这很有帮助。
    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 2012-10-17
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2014-08-17
    相关资源
    最近更新 更多