【问题标题】:Need to call tcl proc from another file in c++需要从 c++ 中的另一个文件调用 tcl proc
【发布时间】:2014-01-24 06:37:15
【问题描述】:

我正在编写一个 c++ 代码来评估一个 tcl proc。我有两个 TCL 文件。两个中的任何一个都可以拥有 tcl proc 说 file1.tcl 有 tcl proc mytest。 file2.tcl 正在采购 file1.tcl,所以如果我在 file2.tcl 中执行 [info procs mytest],我可以获得 tcl proc 名称 mytest。 但是在 C++ 中,当我尝试评估 proc 时,它显示命令 mytest 无效。 但是,如果我在 file2.tcl 中编写 proc mytest ,它可以工作。

file1.tcl 是用户输入,file2.tcl 是默认输入。只有在 file1.tcl 中缺少 proc 的情况下,我才会调用 file2.tcl proc。 请建议我怎样才能让它工作。

谢谢 汝驰

【问题讨论】:

标签: c++ tcl


【解决方案1】:

您的问题并不完全清楚,但您似乎有两个文件,其中一个由您控制(并提供一些 Tcl 命令的默认实现?),另一个由您的用户控制(因此他们可以覆盖事物吗?)。然后您想将这些加载到 Tcl 解释器上下文中,以便您可以从 C++ 调用事物?我会假设这就是正在发生的事情。

首先,从 Tcl 的角度来看,您通过将上下文(Tcl_Interp*)获取到具有默认实现的文件的source 来做到这一点。 (还有其他方法可以做到这一点,但这绝对是最简单的。)只有在完成之后,您才会source 包含用户定义的文件,并且您只会在 everything 已正确完成采购。这就是我们的目标。

在 C++ 中,需要注意的主要事项是 Tcl_EvalFile() 相当于 Tcl 中的 source(正如 Tcl_Eval() 相当于 eval),并且您拥有 小心检查错误; Tcl 根本不会将其异常系统映射到 C++ 异常,因此检查那些返回码

Tcl_Interp *interp = Tcl_CreateInterp();

if (Tcl_EvalFile(interp, "file2.tcl") != TCL_OK) {
    const char *errorMessage = Tcl_GetString(Tcl_GetObjResult(interp));
    // Deal with error
    cerr << "Problem in library: " << errorMessage << "\n";
    exit(1);
}

if (Tcl_EvalFile(interp, "file1.tcl") != TCL_OK) {
    const char *errorMessage = Tcl_GetString(Tcl_GetObjResult(interp));
    cerr << "Problem in user code: " << errorMessage << "\n";
    exit(1);
}

// Everything ready
if (Tcl_Eval(interp, "[the_party get] start") != TCL_OK) {
    // Something still went wrong...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多