我正在尝试将libzip
链接到Raku,它使用无效的struct
或没有主体的结构,例如:
struct zip;
typedef struct zip zip_t;
我在Raku程序中以相同的方式声明它:
class zip_t is repr('CStruct'){};
此操作失败,并显示以下信息:
Class zip_t has no attributes, which is illegal with the CStruct representation.
我发现有关该错误的唯一参考文献是MyHTML中的in this non-addressed issue。这可能会使它回归,但我不确定。有想法吗?
答案 0 :(得分:5)
google for "no attributes, which is illegal with the CStruct representation"产生三个匹配项。第三条引出以下recent bug/change代表module LibZip:
- class zip is repr('CStruct') is export { }
+ class zip is repr('CPointer') is export { }
在我发表这篇文章之前,我看到Curt Tilmes发表了类似的评论。
我对C知之甚少,但我喜欢研究事物。这个答案是一个猜测和一些基于谷歌搜索的注释。
您引用的错误消息与NativeCall有关,这又意味着与Rakudo编译器有关,而不是Raku语言。 (我想您知道这一点,并且对于许多人和情况而言,区别通常并不重要,但在这种情况下,我认为值得注意。)
google for "empty struct"的最高SO匹配为Empty structs in C。该问题询问有关空结构的语义并将其与外语一起使用的问题。这个问题及其答案似乎很有用。接下来的几点是基于摘录。
“没有命名成员的结构[具有未定义的行为]”。我想说这解释了为什么您会收到NativeCall错误消息(“没有属性,这对于CStruct表示形式是非法的”)。 NativeCall的目的是为C提供一个可靠的可移植接口,因此它可能必须总结性地拒绝未定义的方面。 (也许错误消息可能提示您该怎么做?可能不是。建议您像以前一样,必须搜索消息的匹配项,这样可能更好。然后大概他们会看到此消息。)
< / li>我想您只是想与libzip的空结构进行绑定,作为来回传递数据而不读取或写入数据的一部分。我怀疑这就是问题的症结所在。鉴于NativeCall(相当合理)拒绝以通常的方式进行绑定,您该如何绑定?
”从编写绑定到C库的[外语]的角度来看...除了将它们传递给导入的C外,您永远不会对[empty struct]类型的对象做任何事情功能。”我认为这对于您的情况是正确的,并且根据C规范,任何其他行为都是未定义的行为,因此,至少对于C库和用于编译Rakudo的C编译器都与特定的C编译器相关联,即使在那时也可能未定义。我以为Curt曾问过您的用法,以防绑定正在执行或需要执行某些疯狂操作,但我对此非常怀疑。