我试图在 Perl 6 中声明以下 C 结构:
struct myStruct
{
int A[2]; //<---NEED to declare this
int B;
int C;
};
我的问题是我不知道如何声明int A[2];
部分使用内置的 NativeCall api。
所以我所拥有的是:
class myStruct is repr('CStruct') {
has CArray[int32] $.A;
has int32 $.B;
has int32 $.C;
};
然而,我知道,has CArray[int32] $.A;
部分是错误的,因为它没有声明我的结构中仅占用 2 的部分int32
sizes.
更新2:事实证明,在我第一次发布这个答案时这不起作用,因此出现了评论。我still还没有测试过,但根据托比亚斯的回答,它肯定有效使用 NativeCall 将 CStruct 中的内联 CArray 传递到共享库. \o/
我还没有对此进行测试,但是在使用 Rakudo 编译器版本 2018.05 时应该可以工作:
use NativeCall;
class myStruct is repr('CStruct') {
HAS int32 @.A[2] is CArray;
has int32 $.B;
has int32 $.C;
}
HAS
代替has
使属性成为内联属性而不是指针;
int32
代替int
是因为 Perl 6int
类型与 C 的类型不同int
类型而是特定于平台的(通常是 64 位);
@
代替$
将属性标记为Positional(“支持通过索引查找值”)而不是标量(被视为单个事物);
[2]
“塑造”位置数据以具有 2 个元素;
is CArray
绑定一个CArray
作为位置数据的容器逻辑;
这个承诺从今年四月开始连接上is repr('CStruct')
使用声明的属性信息来适当地分配内存。
Fwiw我发现了这个功能搜索 #perl6 日志CArray发现它已经登陆master并且2018.05从在 Rakudo 提交中搜索提交消息标题.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)