如何用C/C++开发命令界面为Tcl shell的工具?

Dre*_*ktz 1 tcl

假设需要开发一个用C/C++编写并具有Tcl命令行界面的工具X,步骤或方法是什么?

我了解 Tcl C API,它可以通过为其编写 C 扩展来扩展 Tcl。

Don*_*ows 5

您想要做的是嵌入 Tcl(完全是受支持的用例;Tcl 记得它是一个 C 库),但仍然制作类似 tclsh 的东西。最简单的方法是:

获取一份副本tclAppInit.c(例如,是我写这篇文章时 Tcl 8.6 源代码树中的当前副本)并对其进行调整,可能是通过将代码放在函数中来注册额外的命令、链接变量等Tcl_AppInit();你可能可以简单地修剪掉一堆东西。然后直接构建并链接到 Tcl 库(存根),以有效地获得您自己的自定义 tclsh 以及您的额外功能。

如果您对交互式使用不感兴趣,您可以更广泛地使用 Tcl 的 API。非交互式使用的核心是:

// IMPORTANT: Initialises the Tcl library internals!
Tcl_FindExecutable(argv[0]);

Tcl_Interp *interp = Tcl_CreateInterp();
// Register your custom stuff here

int code = Tcl_Eval(interp, "your script");
// Or Tcl_EvalFile(interp, "yourScriptFile.tcl");

const char *result = Tcl_GetStringResult(interp);
if (code == TCL_ERROR) {
    // Really good idea to print out error messages
    fprintf(stderr, "ERROR: %s\n", result);
    // Probably a good idea to print error traces too; easier from in Tcl
    Tcl_Eval(interp, "puts stderr $errorInfo");
    exit(1);
}

// Print a non-empty result
if (result[0]) {
    printf("%s\n", result);
}
Run Code Online (Sandbox Code Playgroud)

这就是您所需要的一切,除非您正在进行交互式使用,而这时候就Tcl_Main()变得非​​常有用(它处理相当多的额外繁琐的细节),示例tclAppInit.c(上面提到的)展示了如何使用它。