jjm*_*elo 4 rakudo nativecall raku
我正在尝试链接libzip
到 Raku,它使用了一个 voidstruct
或一个没有主体的结构,如下所示:
struct zip;
typedef struct zip zip_t;
Run Code Online (Sandbox Code Playgroud)
我以同样的方式在我的 Raku 程序中声明它:
class zip_t is repr('CStruct'){};
Run Code Online (Sandbox Code Playgroud)
这失败了:
Class zip_t has no attributes, which is illegal with the CStruct representation.
Run Code Online (Sandbox Code Playgroud)
我发现该错误的唯一参考是在 MyHTML中的这个未解决的问题中。这可能使它成为一种回归,但我真的不确定。任何的想法?
一个对谷歌“没有属性,这与CStruct表示非法”产生的三场比赛。第三个导致了以下最新的错误/变化的模块LibZip:
- class zip is repr('CStruct') is export { }
+ class zip is repr('CPointer') is export { }
Run Code Online (Sandbox Code Playgroud)
在我发表这篇文章之前,我看到 Curt Tilmes 发表了类似的评论。
我对 C 知之甚少。但我喜欢研究事物。这个答案是基于谷歌搜索的猜测和一些注释。
您引用的错误消息是关于 NativeCall,这反过来意味着它是关于 Rakudo 编译器,而不是 Raku 语言。(我想你知道这一点,对于许多人和情况来说,这种区别通常并不重要,但我认为在这种情况下值得注意。)
谷歌“空结构”的顶级 SO 匹配是C 中的 Empty structs。该问题询问空结构的语义以及将它们与外语一起使用。这个问题及其答案似乎很有用;接下来的几点是基于他们的摘录。
“没有命名成员的结构[具有未定义的行为]”。我会说这解释了为什么您会收到 NativeCall 错误消息(“没有属性,这对于 CStruct 表示是非法的”。)。NativeCall 是关于拥有一个可靠的 C 可移植接口,因此它大概必须立即拒绝未定义的方面。(也许错误消息可以暗示该怎么做?可能不会。最好有人必须搜索与消息匹配的内容,就像您所做的那样。然后大概他们会看到这个。)
我认为您只是试图与 libzip 的空结构绑定,作为来回传递数据的一部分,而无需读取或写入数据。我怀疑这就是问题的症结所在;鉴于 NativeCall(相当合理)拒绝以通常的方式进行绑定,您如何绑定?
“从编写 [一门外语] 绑定到 C 库的角度来看......你永远不会对 [空结构] 类型的对象做任何事情,除非将它们传递给导入的 C 函数。” 我认为这适用于您的情况,并且根据 C 规范,其他任何行为都是未定义的行为,因此至少与用于编译 Rakudo 的 C 库和 C 编译器的特定 C 编译器相关联,即使那时也很可能未定义。我想 Curt 已经询问过你的使用情况,以防绑定正在做或需要一些疯狂的事情,但我非常怀疑它是。
归档时间: |
|
查看次数: |
91 次 |
最近记录: |