2012-01-20 7 views
2

TclのC言語APIであるtcl.hで定義されている以下の構造体にまたがっています。TCL Cの構造体の理解C API

ドキュメントで
typedef struct { 
char *result; 
Tcl_FreeProc *freeProc; 
int errorLine; 
} Tcl_Interp; 

typedef void Tcl_FreeProc(char *blockPtr); 

、それらは構造体のメンバフィールドで次のように述べている:

結果フィールドポイント結果またはエラーメッセージを表す文字列、及びfreeProcフィールドにどのように伝えますもはや必要でないときに文字列の記憶域を破棄します。

Tcl_SetResultのfreeProc引数は、Tclシステムがresult引数のためにストレージをどのように管理するかを指定します。 interpが文字列の結果を保持しているときにTcl_SetResultまたはTcl_SetObjResultが呼び出されると、古い文字列の結果を破棄するために必要な処理が実行されます。

freeProcは、TCL_STATIC、TCL_DYNAMIC、またはTCL_VOLATILEの3つの主な値を取ることができます。

freeProcがTCL_STATIC、TCL_DYNAMIC、およびTCL_VOLATILEのいずれかの値でない場合は、Tclがその文字列を解放するために呼び出す必要があるプロシージャのアドレスです。これにより、アプリケーションは非標準ストレージアロケータを使用できます。

フィールドがtcl.hヘッダで定義されています。私は理解できない何

#define TCL_VOLATILE ((Tcl_FreeProc *) -1) 
#define TCL_STATIC ((Tcl_FreeProc *) 0) 
#define TCL_DYNAMIC ((Tcl_FreeProc *) free) 

は、彼らは3つの値が定義されている方法です。 voidリターンとchar *引数を持つ関数ポインタであってはなりませんか?どのように0や-1のような値を取ることができますか?

+2

関数を呼び出す前に、それらの定数に対して 'freeProc'を比較する必要があります。 **これらの定数のうちの1つではない場合は、呼び出すことのできる関数です。 –

+2

Tclのそれ以降のバージョンでは、これらのフィールドが廃止されている(または内部が覆われている)ことに注意してください。 'freeProc'フィールド(結果だけでなく)と' Tcl_ResetResult() 'を設定するには' Tcl_SetResult() 'を使います。これらの2つの機能は数十年前からありました。フィールド自身に直接アクセスする必要がなくなる理由はありません。 –

答えて

2

Tcl_FreeProcはポインタであり、ポインタとして任意の値を割り当てることができます。

この場合、ポインターは-1,0または実アドレスのいずれかに割り当てられ、-1と0は有効なアドレスではないため、freeProcが(呼び出す必要のある)関数か、これらの値の1つで、自由な機能は必要ありません。

EDIT:Chrisのために改訂しました。

+2

ポインタ値へのキャスト0は、 "(a)実アドレスではありそうにない" - それは非常に具体的にはヌルポインタ定数です。一方、-1は "これが何も壊れないことを希望する"というアドレスに過ぎない。 –

+0

@ChrisLutzはあなたがプレイしているハードウェアによって異なります。 –

+0

いいえ、そうではありません。 C標準は、リテラル0がポインタ定数として解釈されるとき、それがヌルポインタであると述べている。ハードウェア表現は全ビット-0でなくてもよいが、Cプログラミング言語0は常にヌルポインタである。 –