C语言long double映射至Raku及调用对应C函数的方法
从Raku调用接收
long double类型的C函数 给定如下C函数:
long double foo(long double *array, size_t n) { // 执行相关操作 }
如何从Raku中调用该函数?Rakudo原生类型文档中列出了部分Raku与C类型的对应关系:
| Raku | C类型 |
|---|---|
| long | long in C |
| longlong | longlong in C |
| ulong | long and unsigned in C |
| ulonglong | longlong and unsigned in C |
| size_t | size_t and unsigned in C |
| ssize_t | size_t in C |
| bool | bool in C |
我曾尝试将long double映射为long num64,但该方式并不生效。
解决方法
在Raku中,long double对应的原生类型是num128(依赖平台对128位浮点数的支持,现代多数编译器与系统均兼容)。需借助NativeCall模块完成函数绑定:
- 导入NativeCall模块:
use NativeCall;
- 声明C函数绑定,指定正确类型:
sub foo(CArray[num128] $array, size_t $n --> num128) is native { * }
注:C中的指针参数long double *array,在Raku中可通过CArray[num128]显式声明数组类型,NativeCall会自动处理指针转换。
- 调用示例:
# 创建num128类型数组 my CArray[num128] $c-array = CArray[num128].new: num128(1.5), num128(2.7), num128(3.9); # 调用函数并传递参数 my num128 $result = foo($c-array, 3); say $result;
若平台不支持num128,可尝试num64替代,但会丢失long double的精度,仅作为临时方案。
内容的提问来源于stack exchange,提问作者Suman
相关产品推荐
相关产品推荐

