0

コンテキスト C/C++ から SWIG 経由で Tcl コールバックを呼び出したいです。さらに重要なことに、私はそれを閉鎖したいと思っています。

予備知識 http://computer-programming-forum.com/57-tcl/4481cebe0f09966d.htm (いいえ、それは私ではありません。Google 検索で十分に類似しているように見えた唯一のものです)

Python では、Python 側でオブジェクトを作成し、それに__call__メソッドを与え、SWIG を介して PyObject* としてチャックします。それでも、Python でコーディングされているように (少しグルー コードを使用して) 非ローカル変数にアクセスできます。それが作成されたインタプリタと今でも密接にリンクしています。

私の理解 (ここで訂正してください) Tcl では、C から関数を呼び出す唯一の方法は、コマンドを表す文字列を渡すことによって新しいインタープリターを使用することです (しかし... クロージャーはどこにあるのでしょうか...?)。Tcl から C/C++ を呼び出している場合、C/C++ は呼び出し元の Tcl インタープリターを認識しないため、同じ問題が発生します。

Annnnddd... ドキュメント ( http://www.tcl.tk/man/tcl8.6/TclLib/contents.htm ) は広範囲ですが、... まあ、本当に広範囲です。集合知が私の無知から私を救ってくださいますように。

質問Tcl の名前が指している値を C/C++ からクロージャ/変更するにはどうすればよいですか? それとも、C/C++ コードを呼び出しているインタープリターのハンドルを取得するだけですか?

4

1 に答える 1

0

これらすべてにおいて、Tcl の実装はほとんどが C ライブラリであり、C++ ではなく C の方法で行うことを理解してください。これは

あなたが望むのは、C++ クロージャを でstruct割り当てたフィールドとして配置することですnew次に、ポインタを;への引数structとしてキャストします。コマンドが呼び出されると、そのポインターがコールバック関数への引数の 1 つとして返されます。これを実際の型にキャストしてから呼び出すことができます。コマンドが削除されると、別のコールバックを取得します (要求した場合)。これは、割り当てられ. 大変な作業のように聞こえますが、実際にはそうではありません。ClientDataTcl_CreateCommanddeletestruct

私自身の製品コードでは SWIG も C++ も使用していないため、これを優れた SWIGgable アプローチに結び付ける方法が正確にはわかりません。クロージャーを通常のオブジェクトに入れてから、それをSWIGするのですか?ただし、内部では、上記のことを行う必要があります。reinterpret_cast<…&gt;(残念ながら、関連するキャストのタイプはです。 は、Tcl ライブラリ コードが内部に突っ込まないという約束とともに、Tcl の古いバージョンを古いコンパイラで使用していない限りClientData、実際には単なるエイリアスです。 void *) を使用することをお勧めしstructます。これは、物をぶら下げなければならないスペース全体のサイズが、マシン ポインターの幅の 1 つにすぎないためです。さらに、おそらくすべてを素敵なクラスにまとめて、厄介な詳細を隠すことができますが、私は C++ の第一人者ではないので、そこまでお手伝いすることはできません。

于 2013-06-18T06:55:50.963 に答える