我正在尝试移植此代码:

struct SoundIoChannelLayout {
    const char *name;
    int channel_count;
    enum SoundIoChannelId channels[SOUNDIO_MAX_CHANNELS];
};

但我不知道如何定义 channels 的类型,而且我知道我不能使用指针,因为最终的结构大小不会相同。

最佳答案

我能够使用 crystal_lib 自动生成它:

$ cd crystal_lib
$ cat examples/soundio.cr
@[Include("soundio/soundio.h", prefix: %w(SoundIo))]
@[Link("soundio")]
lib LibSoundio
end
$ crystal src/main.cr -- examples/soundio.cr > soundio.cr

所以它看起来像这样:
@[Link("soundio")]
lib LibSoundio
  MAX_CHANNELS = 24

  struct ChannelLayout
    name : LibC::Char*
    channel_count : LibC::Int
    channels : ChannelId[MAX_CHANNELS]
  end

  enum ChannelId
    Invalid = 0
    FrontLeft = 1
    FrontRight = 2
    FrontCenter = 3
    # ...
  end
  # ...
end

注意:您可能需要手动更新结果文件,因为 Crystal_lib 仍处于试验阶段。

关于crystal-lang - 如何在 C 绑定(bind)中使用数组类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45900199/

10-12 23:25