0

上下文 我想通过 SWIG 从 C/C++ 调用 Tcl 回调。更重要的是,我希望它是一个闭包。

先验知识 http://computer-programming-forum.com/57-tcl/4481cebe0f09966d.htm(不,那不是我,只是在谷歌搜索中看起来足够相似的唯一东西)

使用 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作为ClientData参数转换为Tcl_CreateCommand; 当命令被调用时,你会将该指针作为回调函数的参数之一取回,然后你可以将其转换回它的真实类型,然后调用。当命令被删除时,你会得到另一个回调(如果你要求它),delete分配struct. 这听起来像是很多工作,但实际上并非如此。

我不知道如何将它与一个好的 SWIGgable 方法联系起来,因为我在自己的生产代码中没有使用 SWIG 或 C++。也许把闭包放在一个普通的对象中,然后 SWIG 呢?然而,在幕后,需要发生的是上述情况。reinterpret_cast<…&gt;(不幸的是,所涉及的转换类型ClientData实际上只是一个别名void *——除非你使用的是带有古老编译器的古老版本的 Tcl——以及 Tcl 库代码不会以任何方式插入内部的承诺。 ) 我推荐使用 a struct,因为你必须把东西挂起来的整个空间只是一个机器指针的宽度。更重要的是,您可能可以将所有内容封装在一个不错的类中以隐藏血淋淋的细节,但由于我不是 C++ 大师,因此我无法真正帮助您。

于 2013-06-18T06:55:50.963 回答