Nim从C头文件导入typedef

时间:2019-04-09 05:38:13

标签: ffi nim

我想知道是否可以导入C类型定义或是否需要在Nim中重新定义它?

看与该proc接口的名为jhead的程序

int ReadJpegFile(const char * FileName, ReadMode_t ReadMode);

第二个参数ReadMode_t是jhead.h

中的枚举类型
typedef enum {
    READ_METADATA = 1,
    READ_IMAGE = 2,
    READ_ALL = 3,
    READ_ANY = 5        // Don't abort on non-jpeg files.
}ReadMode_t;

我可以导入此ReadMode_t吗?还是我必须像下面一样重新定义它

type
  ReadMode_t* = enum
    READ_METADATA = 1, READ_IMAGE = 2, READ_ALL = 3, READ_ANY = 5

1 个答案:

答案 0 :(得分:1)

Nim编译器需要了解这些C常量,因此您必须定义它们才能从Nim中使用它们。但是,可以使用c2nim之类的工具简化繁琐的复制过程,甚至在某种程度上实现自动化。实际上,如果您使用以下test.h文件:

typedef enum {
    READ_METADATA = 1,
    READ_IMAGE = 2,
    READ_ALL = 3,
    READ_ANY = 5        // Don't abort on non-jpeg files.
}ReadMode_t;

int ReadJpegFile(const char * FileName, ReadMode_t ReadMode);

并运行c2nim test.h,它将为您生成以下test.nim文件,从而节省了大部分繁琐的翻译工作:

type
  ReadMode_t* = enum
    READ_METADATA = 1, READ_IMAGE = 2, READ_ALL = 3, READ_ANY = 5


proc ReadJpegFile*(FileName: cstring; ReadMode: ReadMode_t): cint