残念ながら、CCodeについては単なる意味のある文書はあまりありません。あなたがする必要があるのは、Valaに付属のVAPIファイルと組み合わせて使用することです。その最も基本的で、あなたはおそらく、このようなマクロなものを使用します。ここでは、cname
(すなわち、Cコード中に放出される名前)、およびcheader_filename
(すなわち、設定されている
[CCode(cname = "FOO", cheader_filename = "blah.h")]
public extern void foo();
ヘッダーファイルは#include
でなければなりませんd)。その他のCCode属性のほとんどは、配列の処理方法を制御します。 array_length = false
は、配列の長さが不明であることを示します。これは、戻り値の型に適用されることを示すパラメータまたはメソッドに適用できます。例えば:y
はFILE **y(void)
の予想Cプロトタイプとヌルで終わる配列を有すると仮定されている間、この例では
[CCode(array_length = false)] public int[] x();
[CCode(array_null_terminated = true)] public FileStream[] y();
public int[] z();
、x
は、未知の配列の長さを有し、int *x(void)
の予想されるCプロトタイプを有することになります。最後に、z
をlength
が返される配列の長さを格納する場所へのポインタであるint *z(int *length)
の配列の長さアウトパラメータ(すなわち、プロトタイプを有するものとする。
これらのすべてがあまりにパラメータに適用することができます。配列の長さが配列の直後の引数でない場合は、array_length_pos
を指定すると便利です。パラメータがデリゲートの場合は、target_pos
は、ユーザーデータが渡される場所を指定します(つまり、関数ポインタを使用するvoid*
)
デリゲート、クラス、および構造体で使用するさまざまなCCode属性もあります。instance_pos
は、クラス/構造体インスタンスまたはデリゲートユーザーデータが移動します。すべての位置引数は浮動小数点数で指定されます。これにより、複数の位置を符号化することができる。例えば、我々は、Cのプロトタイプを持っていたとします
void foo(void* userdata, int length, double *dbl_array, void(*handler)(double,void*));
その後、我々はこれを書くかもしれません:Handler
考える
[CCode(cname = "foo")]
public void foo([CCode(array_length_pos = 0.2)] double[] array, [CCode(target_pos = 0.1)] Handler func);
が他の場所でデリゲートとして定義されている、あなたはpos
値は後に引数を入れていることがわかります引数0(すなわち、開始点)、次に特定の順序で指定します。
クラスと構造体には、初期化、破壊、および参照カウントを処理する関数がありますが、それはかなり単純です。ジェネリックの扱いも少し複雑です。繰り返しますが、VAPIは洞察の最良の源です。しかし、基本的なCの関数とマクロを使い始めるには十分です。
詳細なドキュメントが見つかりました:https://live.gnome.org/Vala/Manual/Attributes#CCode_Attribute –