【发布时间】:2019-04-17 13:12:04
【问题描述】:
我们有一个内置我们的 C/C++ 应用程序的 Tcl,我在我们的代码中找到了如果找不到命令则调用 Tcl_EvalObjv 的地方。我不得不承认代码已经很老了,而且我们的开发人员并不知道这个模块中发生了什么。
看起来像这样:
// ... there is some checking if command is registered etc., it fails and the code goes here:
std::vector<Tcl_Obj*> tclArgs = { NULL };
for (int i = 1; i < objc; ++i)
tclArgs.push_back(objv[i]);
tclArgs.shrink_to_fit();
// ...
tclArgs[0] = ::Tcl_NewStringObj(ORIGINAL_UNKNOWN, ORIGINAL_UNKNOWN_SIZE);
Tcl_IncrRefCount(tclArgs[0]);
::Tcl_ExposeCommand(pInterp, ORIGINAL_UNKNOWN, ORIGINAL_UNKNOWN);
result = ::Tcl_EvalObjv(pInterp, objc, &tclArgs[0], TCL_EVAL_GLOBAL); //<--
::Tcl_HideCommand(pInterp, ORIGINAL_UNKNOWN, ORIGINAL_UNKNOWN);
// ORIGINAL_UNKNOWN is char* it is just "unknown"
我们的应用程序中有命令处理程序,而在 CmdUnknown() 函数中执行 Tcl_EvalObjv 时,Tcl 有时会调用不同的命令。以下示例:
现有命令列表:“banana”、“applepie”、“carpet”、“card”
命令:“apple”,Tcl 调用“applepie”(错误,“apple”不是“applepie”)
命令:“blah”,Tcl 给出错误(正确)。
命令:“汽车”,Tcl 给出错误(正确,可能是因为 2 个类似的命令)。
Tcl 在搜索命令失败时是否有某种机制?问题是我找不到任何与我们的代码相关的东西来完成命令,所以也许 Tcl 可以吗?
【问题讨论】:
-
我不知道这是在哪里记录的,但用户只需要提供命令的最小前缀,以便明确:
a足以区分“applepie”与其他命令。同样,b、carp和card是明确的命令前缀。 -
现在我想知道是否有办法将其关闭。所以我想我必须在“apple#”之类的命令之后添加特殊字符,然后如果返回错误,请找到该字符并将其删除。但也许tcl或flag中存在这样的功能来设置?