我面临的问题是 - 我有优化库的 C 代码,它接受指向函数的指针作为参数之一。因此,以前我使用 SWIG 为 C 函数生成 Tcl 包装器,但在这种情况下,我需要从 C 调用 Tcl 函数。每次调用回调时,它都会计算具有特定参数作为其参数的函数的值。我想为此调用 Tcl 过程,它应该在同一个解释器中完成,我调用 C 优化过程,然后将数据返回给 C 程序。
我发现如果不修改 C 源代码和一些类型映射 hack,使用 SWIG 是不可能的。还有其他选择吗?我检查了 Critcl,但我又必须修改和重新排序 C 源代码。我现在看到的唯一可行选项是直接使用 Tcl C API。还有其他方法可以实现这一点吗?谢谢。
从 C 调用 Tcl 命令的最佳方法是 API 函数
Tcl_EvalObjv()
。您需要一个解释器上下文来调用它,并且命令名称和命令的其他参数在句柄数组Tcl_Obj*
(包含所有 Tcl 值的框类型)中传递。这种调用方法的开销最低,但传递的值必须具有非零引用计数(即,Tcl_IncrRefCount
在之前和Tcl_DecrRefCount
之后调用它们)。否则,构建一个字符串并调用
Tcl_Eval()
(或一个 Tcl 值并调用Tcl_EvalObj()
)。这会产生额外的开销,例如需要解析字符串。您可以使用或 之
Tcl_Obj*
类的调用来制造手柄。Tcl_NewIntObj()
Tcl_ObjPrintf()
有关从 C 调用命令的更多选项,请参阅https://www.tcl-lang.org/man/tcl8.6/TclLib/Eval.htm。