不幸的是,没有大量关于 CCode 的单独有意义的文档。您需要做的是将它与 Vala 附带的 VAPI 文件结合使用。在最基本的情况下,您可能会使用如下宏:
[CCode(cname = "FOO", cheader_filename = "blah.h")]
public extern void foo();
这里我们设置cname
(即,将被发送到C 代码中的名称)和cheader_filename
(即,应为#include
d 的头文件)。大多数其他 CCode 属性控制如何处理数组。array_length = false
表示数组的长度未知。这可以应用于参数或方法,表示应用于返回类型。例如:
[CCode(array_length = false)] public int[] x();
[CCode(array_null_terminated = true)] public FileStream[] y();
public int[] z();
在此示例中,x
将具有未知的数组长度并具有预期的 C 原型int *x(void)
,而y
假设具有以空结尾的数组,预期的 C 原型为FILE **y(void)
。最后,z
假设有一个数组长度输出参数(即 的原型int *z(int *length)
,其中length
是指向存储返回数组长度的位置的指针。
所有这些也可以应用于参数。array_length_pos
指定是否有数组长度也很有用,但它不是紧跟在数组后面的参数。如果参数是委托,target_pos
则指定用户数据的传递位置(即,void*
与函数指针一起传递的位置)。
还有各种用于委托、类和结构的 CCode 属性。instance_pos
指定类/结构实例或委托用户数据的去向。所有位置参数都用浮点数指定。这允许对多个位置进行编码。例如,假设我们有一个 C 原型:
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);
GivenHandler
在其他地方被定义为委托,您可以看到这些pos
值将参数放在参数 0 之后(即开始),然后以特定顺序放置。
类和结构具有处理初始化、销毁和引用计数的功能,但这些功能相当简单。处理泛型也有点复杂。同样,VAPI 是最好的洞察力来源。但是,这足以让您开始使用基本的 C 函数和宏。