如何在cython中编写带有嵌套括号的#define表达式?

问题描述

C表达式:

#define EFX_REVERB_PRESET_GENERIC \
    { 1.0000f,1.0000f,0.3162f,0.8913f,1.4900f,0.8300f,0.0500f,0.0070f,{ 0.0000f,0.0000f,0.0000f },1.2589f,0.0110f,0.2500f,0.9943f,5000.0000f,250.0000f,0x1 }

我想在 .pxd文件中定义此表达式。

我必须将此表达式作为参数传递给某些C函数。因此,我不要将其用于Python

来源:OpenAL-Soft:https://github.com/kcat/openal-soft/blob/master/include/AL/efx-presets.h#L37

解决方法

值得意识到的是,并非所有内容都可以直接从C转换为Cython。在这种情况下,EFX_REVERB_PRESET_GENERIC实际上不是使用类型定义的,因为它不是类型-它只是括号和数字的集合。这些括号和数字仅在少数地方有效:

 void other_func(WhateverTheStructIsCalled s);

 void func() {
     WhateverTheStructIsCalled s = EFX_REVERB_PRESET_GENERIC; // OK
     s = EFX_REVERB_PRESET_GENERIC; // wrong - not an initialization
     other_func(EFX_REVERB_PRESET_GENERIC); // also doesn't work
 }

因此,它实际上并不适合Cython的模型,因此您不能直接包装它。

我要做的是自己编写一个小的C包装程序。您可以使用Cython的“内联C代码”功能来做到这一点:

cdef extern from *:
    """
    WhateverTheStructIsCalled get_EFX_REVERB_PRESET_GENERIC(void) {
        WhateverTheStructIsCalled s = EFX_REVERB_PRESET_GENERIC;
        return s;
    }
    """
    WhateverTheStructIsCalled get_EFX_REVERB_PRESET_GENERIC()

然后使用get_EFX_REVERB_PRESET_GENERIC()调用此函数并获取相关的初始化结构。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...