不幸的是,不是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
將具有未知陣列的長度和具有int *x(void)
預期C原型,而假定y
具有與FILE **y(void)
預期C原型的空終止陣列。最後,假定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);
鑑於Handler
被定義爲其它地方的代表,你可以看到pos
值將這些參數後,參數0(即開始),然後按特定順序。
類和結構有函數來處理初始化,破壞和引用計數,但這些都是相當簡單的。處理泛型也有點複雜。再次,VAPI是洞察力的最佳來源。但是,這足以讓您開始使用基本的C函數和宏。
我發現了更多文檔:https://live.gnome.org/Vala/Manual/Attributes#CCode_Attribute – 2012-04-16 14:12:01