Crystal C 绑定:参数 const unsigned char **

Crystal C bindings: argument const unsigned char **

这是我尝试使用的 C 函数的签名(生成二进制数据数组):

long get_output( const unsigned char ** );

我将其映射为:

fun output = get_output( UInt8** ): Int32

在 C 中使用它的工作示例:

const unsigned char * data;
get_output( &data );

但是在Crystal:

data = uninitialized UInt8
MyLib.output( pointerof( pointerof( data ) ) ) # ERR: pointerof of pointerof not allowed

这个有效:

data = uninitialized UInt8*
MyLib.output(pointerof(data))

请注意,您的参数是 UInt8**,因此您需要声明类型为 UInt8* 的变量。

然而,Crystal 非常好地支持这个习语,使用 out 关键字:https://crystal-lang.org/docs/syntax_and_semantics/c_bindings/out.html

MyLib.output(out data)
# use data

最后一种方式是首选,因为它更干,你不必重复类型。

还要注意,long 通常映射到 Int64。一般LibC下都有不错的别名,比如LibC::CharLibC::Long