如何在Cython中使用#define作为char数组的大小

时间:2015-06-12 14:36:57

标签: python c++ cython

c ++ header(some.h)包含:

#define NAME_SIZE 42

struct s_X{
 char name[NAME_SIZE + 1]
} X;

我想在Python中使用X结构。我怎么能做到?

我写道:

cdef extern from "some.h":
    cdef int NAME_SIZE # 42

    ctypedef struct X:
        char name[NAME_SIZE + 1]

出现错误:不允许使用常量表达式

2 个答案:

答案 0 :(得分:1)

在声明类型时你告诉Cython通常并不重要 - 它使用信息来检查你没有做任何明显错误的类型转换,就是这样。 cdef extern "some.h"语句确保将some.h包含在Cython创建的c文件中,并最终确定所编写的内容。

因此,在这种特殊情况下,您只需插入一个仲裁编号即可正常使用

cdef extern "some.h":
    cdef int NAME_SIZE # 42

    ctypedef struct X:
        char name[2] # you can pick a number at random here

在某些情况下它不会起作用,特别是在Cython必须实际使用它生成的C代码中的数字的情况下。例如:

def some_function():
  cdef char_array[NAME_SIZE+1] # won't work! Cython needs to know NAME_SIZE to generate the C code...
  # other code follows

(我目前没有关于在这种情况下该做什么的建议)

答案 1 :(得分:0)

NAME_SIZE实际上并不存在于您的程序中,因此您可能需要在Python中对其进行硬编码。

尽管它在C源代码中看起来如此,但你也在C数组声明中对其进行了硬编码。