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のような値を取ることができますか?
関数を呼び出す前に、それらの定数に対して 'freeProc'を比較する必要があります。 **これらの定数のうちの1つではない場合は、呼び出すことのできる関数です。 –
Tclのそれ以降のバージョンでは、これらのフィールドが廃止されている(または内部が覆われている)ことに注意してください。 'freeProc'フィールド(結果だけでなく)と' Tcl_ResetResult() 'を設定するには' Tcl_SetResult() 'を使います。これらの2つの機能は数十年前からありました。フィールド自身に直接アクセスする必要がなくなる理由はありません。 –