ffi - Nim 从 C 头文件导入 typedef

标签 ffi nim-lang

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

查看与此过程交互的名为 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

最佳答案

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

关于ffi - Nim 从 C 头文件导入 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55585758/

相关文章:

nim-lang - Nim从项目根目录导入

nim-lang - 如何在 Nim 中用糖解压参数中的元组?

javascript - 在带有 Emscripten 的 Nim 中使用字符串会导致 JavaScript 错误

rust - 如何在 pub extern "C"fn 中返回动态长度向量?

ncurses - native 调用接口(interface) : how to translate "wchar_t"?

Rust FFI 和 CUDA C 性能差异

generics - 在 Nim 中使用泛型转换类型时出现 ObjectConversionError

reflection - `is` 所持有的底层类型是否有 `TAny` 功能?

c - ruby FFI : multi-dimensional array

haskell - 如何通过 C FFI 将 Haskell 数据作为不透明数据类型传递?