C++ 嵌入式Tcl:Tcl是否自动完成命令?

C++ 嵌入式Tcl:Tcl是否自动完成命令?,c++,command,embedded,tcl,C++,Command,Embedded,Tcl,我们有一个内置的TclC/C++应用程序,我在代码中找到了一个地方,如果找不到命令,就会调用Tcl\u EvalObjv。我必须承认,代码非常陈旧,我们的开发人员中没有多少人知道在这个模块中会发生什么 看起来是这样的: // ... there is some checking if command is registered etc., it fails and the code goes here: std::vector<Tcl_Obj*> tclArgs = { NULL }

我们有一个内置的TclC/C++应用程序,我在代码中找到了一个地方,如果找不到命令,就会调用Tcl\u 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"
/。。。有一些检查命令是否已注册等,它失败,代码如下:
std::vector tclArgs={NULL};
对于(int i=1;i结果=::Tcl_EvalObjv(pInterp、objc和tclArgs[0],Tcl_EVAL_GLOBAL)// 正如glenn所暗示的,Tcl in允许使用一些最小但明确的名称前缀来分派命令。我无法告诉您的嵌入式Tcl是如何配置、初始化的,并最终以交互模式运行的。但是,您可能希望通过以下任一方式尝试“关闭”(切换)交互模式:

unset ::tcl_interactive

所有这些都由默认的
unknown
处理程序实现。注意当
tcl\u interactive
为真或假时,如何查找
cmds
列表以及如何区别对待:

puts [info body unknown]

我不知道这是在哪里记录的,但是用户只需要提供命令的最小前缀,以便它是明确的:
a
足以将“applepie”与其他命令区分开来。类似地,
b
carp
card
都是明确的命令前缀。现在我想知道是否有办法关闭它。因此,我想我必须在命令后面添加特殊字符,如“apple#”,然后如果返回错误,则找到该字符并将其删除。但可能这样的函数存在于tcl或要设置的标志中?尝试一下:Put
tcl_SetVar(interp,“tcl_interactive”,“0”,仅tcl_GLOBAL_)
在调用Tcl_EvalObjv
之前的任何位置。谢谢,明天会检查;)
puts [info body unknown]