我有一个可以执行TCL脚本的C应用程序,以及许多在C中实现并使用Tcl_CreateObjCommand注册的自定义TCL命令。
在命令的实现中,我想找出调用了我的命令的TCL脚本的文件名。即类似于“info script
”但是从C调用(我不需要完整路径,只需文件名就足够了)。我命令中唯一的参数是
Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]
clientData为NULL。
那么有一个C函数,我可以只传递Tcl_Interp*
并获取TCL脚本的文件名吗?或者如果它不存在,从TCL命令的实现调用Tcl_Eval*
函数是否安全,因此它将是间接递归调用。
答案 0 :(得分:3)
获取该信息的API只是:
if (Tcl_Eval(interp, "info script") == TCL_OK) {
const char *scriptFile = Tcl_GetString(Tcl_GetObjResult(interp));
// Will be OK until you evaluate another script; copy if necessary
// ...
} else {
// Something bad happened; unlikely for just “info script” in a normal interp
}
没有用于获取执行脚本名称的正式C API,因为通常不需要它。生成的字符串将是传递给source
命令(或Tcl_EvalFile()
或其关系)的任何内容。
通常,是的,从C中实现的Tcl命令调用Tcl_Eval
是安全的。您认为如何实现if
或while
或for
之类的命令?