gpt4 book ai didi

c - 我如何在 Vala 中使用 CCode 属性?

转载 作者:太空狗 更新时间:2023-10-29 17:21:39 25 4
gpt4 key购买 nike

我正在尝试使用来自 Vala 的 C 宏。在我看来,这应该可以通过 CCode 指令实现,但我找不到任何关于如何使用它的有意义的文档。

"The Hacker's Guide to Vala" 中有一个关于 CCode 参数的简短部分。和一个 mailing list thread about calling a C macro from Vala with CCode .

但这两种资源都没有真正帮助我理解 CCode 的真正作用。它显然会影响 Vala 从 Hackers' Guide to Vala 生成 C 代码的方式。我可以推断,CCode 指令可能会直接影响我在遍历 Valas AST 时如何创建 CCode 树。

谁能解释一下 CCode 的作用?

最佳答案

不幸的是,没有大量关于 CCode 单独有意义的文档。你需要做的是将它与 Vala 自带的 VAPI 文件结合使用。在最基本的情况下,您可能会像这样使用您的宏:

[CCode(cname = "FOO", cheader_filename = "blah.h")]
public extern void foo();

这里我们设置了 cname(即,将被发送到 C 代码中的名称)和 cheader_filename(即,应该是的头文件) #included).大多数其他 CCode 属性控制数组的处理方式。 array_length = false 表示数组的长度未知。这可以应用于参数或方法,表明它应用于返回类型。例如:

[CCode(array_length = false)] public int[] x();
[CCode(array_null_terminated = true)] public FileStream[] y();
public int[] z();

在此示例中,x 将具有未知的数组长度并具有 int *x(void) 的预期 C 原型(prototype),而 y假设有一个以 null 结尾的数组,其预期的 C 原型(prototype)为 FILE **y(void)。最后,假定 z 有一个数组长度输出参数(即 int *z(int *length) 的原型(prototype),其中 length是指向存储返回数组长度的位置的指针。

所有这些也可以应用于参数。如果存在数组长度但它不是紧跟在数组之后的参数,则指定 array_length_pos 也很有用。如果参数是委托(delegate),target_pos 指定用户数据的传递位置(即与函数指针一起使用的 void*)。

还有各种用于委托(delegate)、类和结构的 CCode 属性。 instance_pos 指定类/结构实例或委托(delegate)用户数据的去向。所有位置参数都用 float 指定。这允许对多个位置进行编码。例如,假设我们有一个 C 原型(prototype):

void foo(void* userdata, int length, double *dbl_array, void(*handler)(double,void*));

那么我们可以这样写:

[CCode(cname = "foo")]
public void foo([CCode(array_length_pos = 0.2)] double[] array, [CCode(target_pos = 0.1)] Handler func);

鉴于 Handler 在别处被定义为委托(delegate),您可以看到 pos 值将参数放在参数 0 之后(即开始),然后在特定的订单。

类和结构具有处理初始化、销毁和引用计数的函数,但这些函数相当简单。处理泛型也有点复杂。同样,VAPI 是最好的洞察力来源。但是,这足以让您开始使用基本的 C 函数和宏。

关于c - 我如何在 Vala 中使用 CCode 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10175058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com