2012-04-16 7 views
6

私はValaのCマクロを使用しようとしています。これはCCodeディレクティブで可能であるはずですが、私はそれをどのように使用するかに関する意味のある文書を見つけることができません。ValaでCCode属性を使用するにはどうすればよいですか?

CCode引数については、"The Hacker's Guide to Vala"mailing list thread about calling a C macro from Vala with CCodeという短いセクションがあります。

しかし、どちらのリソースも、本当に私がCCodeが本当に何を理解するのに役立ちません。 ValaがCコードを生成する方法に明らかに影響します。Hackers' Guide to Valaから、私は、CCodeディレクティブがValas ASTをトラバースするときにCCodeツリーがどのように作成されるかに直接的な影響を与えると推測できます。

誰でもCCodeの機能を少し説明できますか?

+1

詳細なドキュメントが見つかりました:https://live.gnome.org/Vala/Manual/Attributes#CCode_Attribute –

答えて

8

残念ながら、CCodeについては単なる意味のある文書はあまりありません。あなたがする必要があるのは、Valaに付属のVAPIファイルと組み合わせて使用​​することです。その最も基本的で、あなたはおそらく、このようなマクロなものを使用します。ここでは、cname(すなわち、Cコード中に放出される名前)、およびcheader_filename(すなわち、設定されている

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

ヘッダーファイルは#includeでなければなりませんd)。その他のCCode属性のほとんどは、配列の処理方法を制御します。 array_length = falseは、配列の長さが不明であることを示します。これは、戻り値の型に適用されることを示すパラメータまたはメソッドに適用できます。例えば:yFILE **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プロトタイプを有することになります。最後に、zlengthが返される配列の長さを格納する場所へのポインタである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の関数とマクロを使い始めるには十分です。

関連する問題