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::Char
、LibC::Long
等
这是我尝试使用的 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::Char
、LibC::Long
等