使用SWIG从C / C ++回调Tcl

时间:2013-06-16 22:00:06

标签: c tcl swig

上下文 我想从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 ++代码的解释器??

1 个答案:

答案 0 :(得分:0)

在所有这些中理解Tcl的实现是一个非常多的C库,因此有C语言的做法,而不是C ++的做法。这可能会成为

你想要的是把C ++闭包作为一个字段放在你用struct分配的new中。然后,将指针转换为struct作为ClientData参数Tcl_CreateCommand;当调用该命令时,您将获得该指针作为回调函数的参数之一,然后您可以将其转换回其真实类型然后调用。当命令被删除时,你会得到另一个回调(如果你要求的话),这是 时间到delete分配的struct。这听起来像是很多工作,但事实并非如此。

我不知道如何将其与一个不错的SWIGgable方法联系起来,因为我在自己的生产代码中不使用SWIG或C ++。也许把闭包放在一个普通的物体然后SWIG那个?然而,在幕后,需要发生上述情况。 (遗憾的是,所涉及的演员类型为reinterpret_cast<…>ClientData实际上只是void *的别名 - 除非您使用古代版本的Tcl和古老的编译器 - 以及承诺Tcl库代码不会以任何方式戳入内部。)我建议使用struct,因为你需要挂起的整个空间只是一个机器指针的宽度。更重要的是,你可以将一切都包含在一个很好的课程中,以隐藏血腥的细节,但我不能真正帮助你,因为我不是C ++专家。