3

我尝试从 Cython pxd 有条件地编译(或生成)c 代码。我读到我可以 DEF 定义 aa 值和 IF 根据其值有条件地生成,但是我怎样才能从 pxd 文件外部获取此值?

具体来说,这两个案例现在对我来说很有趣:

  • 给 Cython 一些命令行定义,最好通过 Cython.Distutils setuptools 方式
  • extern-ed C 头文件定义了一些值,并根据该值有条件地使用 Cython 定义(现在可能不可能?)

谢谢

4

2 回答 2

13

您可以生成一个 pxi 文件,并在执行 IF 之前包含它(与 ./configure 生成 config.h 相同。)这就是我们在 Kivy setup.py 中所做的,例如:

c_options = { 
'use_opengl_es2': True,
'use_opengl_debug': False,
'use_glew': False,
'use_mesagl': False}

print 'Generate config.pxi'
with open(join(dirname(__file__), 'kivy', 'graphics', 'config.pxi'), 'w') as fd:
    for k, v in c_options.iteritems():
        fd.write('DEF %s = %d\n' % (k.upper(), int(v)))

然后,在您的 pxd 中:

include "config.pxi"
IF USE_OPENGL_DEBUG == 1:
  # do other import or whatever you want
于 2011-03-02T00:17:53.010 回答
3

实际上,第二种选择更容易。在一些 .h 文件中创建一个标志,然后执行

cdef extern from "header.h":
    cdef int FLAG

然后当你想使用它时,只需写

if FLAG:
    ...

即使 Cython 会生成代码,C 编译器也会自动修剪掉它,因为它在编译时知道 FLAG 的值。

于 2011-03-09T01:41:56.363 回答