2012-04-16 41 views
6

我想從Vala使用C宏。在我看來,這應該是可能的CCode指令,但我沒有找到任何有關如何使用它的有意義的文檔。如何在Vala中使用CCode屬性?

"The Hacker's Guide to Vala"mailing list thread about calling a C macro from Vala with CCode有一個關於CCode自變量的簡短部分。

但無論是資源真的幫助我瞭解什麼CCODE確實。它顯然會影響Vala如何生成C代碼,從Hackers' Guide to Vala我可以推斷出CCode指令可能會直接影響到在遍歷Valas AST時如何創建CCode樹。

任何人可以解釋多一點做什麼CCODE?

+1

我發現了更多文檔:https://live.gnome.org/Vala/Manual/Attributes#CCode_Attribute – 2012-04-16 14:12:01

回答

8

不幸的是,不是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函數和宏。