如何在Ruby FFI模块中包装C常量?

3

我有一个(相当昂贵的)数量:

extern TCODLIB_API const TCOD_color_t TCOD_red;
extern TCODLIB_API const TCOD_color_t TCOD_flame;
extern TCODLIB_API const TCOD_color_t TCOD_orange;
extern TCODLIB_API const TCOD_color_t TCOD_amber;
extern TCODLIB_API const TCOD_color_t TCOD_yellow;
extern TCODLIB_API const TCOD_color_t TCOD_lime;

我如何才能优雅地获取Ruby侧的值?感觉应该有一种attach_const等价于下面使用的attach_function,您可以参考以下内容:
module TCOD
  extend FFI::Library
  ffi_lib File.join(APP_ROOT, "libtcod-1.5.1/libtcod.so")
  attach_function :color_RGB, 'TCOD_color_RGB', [:uchar, :uchar, :uchar], Color.val
end

如果可能的话,我不希望重新定义从lightest_sepia到desaturated_chartreuse的所有内容...

1个回答

4

你需要的是attach_variable

这适用于任何实际上是全局变量的内容(这似乎是你的情况),但不适用于只是 #define 宏常量的情况。

引用FFI::Library文档中的示例:

module Bar
  extend FFI::Library
  ffi_lib 'my_lib'
  attach_variable :c_myvar, :myvar, :long
end
# now callable via Bar.c_myvar

并且:

module Bar
  extend FFI::Library
  ffi_lib 'my_lib'
  attach_variable :myvar, :long
end
# now callable via Bar.myvar

很遗憾,对于 #define 常量没有解决方案,但这个方法有所帮助 :D - Mispy
1
@Mispy:#define 常量有一个解决方案;请参见 FFI::ConstGenerator - womble
@stopanko 的问题应该放在问答区,而不是评论区。 - womble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接