如何理解Tcl的return命令?获取proc参数时的执行疑问
我想要获取Tcl中proc的参数数量,且不希望结果在tclsh中打印,因此使用了return命令。在C环境中执行如下语句:
string tclCmd = "info args " + tclProcName + ";return"; Tcl_Eval(interp, tclCmd.c_str()); string res = Tcl_GetStringResult(interp);
执行后结果未在tclsh中打印,但也无法得到正确值。于是我尝试改为如下写法:
string tclCmd = "info args " + tclProcName; Tcl_Eval(interp, tclCmd.c_str()); string res = Tcl_GetStringResult(interp); Tcl_Eval(interp, "return");
这种写法可行,但我不理解为什么Tcl_Eval执行后结果没有立即打印,且后续的return命令仍然有效。
第一种写法为啥不行?
info args $procName确实会返回proc的参数列表,但你把它和return放同一条脚本里执行时,Tcl脚本的最终结果是最后一条命令的返回值。这里最后一条是return(默认返回空字符串),直接覆盖了前面info args的结果,所以你用Tcl_GetStringResult拿到的是空值,自然得不到正确参数列表。
第二种写法的两个疑问解释
为啥结果没立即打印?
tclsh的交互式环境会自动打印每条命令的结果,但通过C代码里的Tcl_Eval执行Tcl命令时,默认不会主动把结果输出到控制台——只有你显式调用Tcl_PrintResult,或者用Tcl命令把结果输出到通道时,才会触发打印。所以单独执行info args后,结果只存在Tcl解释器的结果寄存器里,不会自动跑到tclsh的输出里。后续的return为啥还能生效?
其实这步return完全是多余的——它只是给解释器的结果寄存器设置了一个空值,但你已经在执行完info args后,通过Tcl_GetStringResult把正确结果存到res变量里了。它之所以看起来“有效”,是因为Tcl_Eval每次执行都会更新解释器的结果寄存器,但这对你已经获取到的res没有任何影响。
更省心的优化写法
你根本不需要额外加return命令,直接执行info args就能拿到结果,而且本来就不会自动打印:
string tclCmd = "info args " + tclProcName; Tcl_Eval(interp, tclCmd.c_str()); string res = Tcl_GetStringResult(interp); // res就是目标proc的参数列表,不会自动输出到控制台
如果想直接获取参数数量,还可以一步到位用llength命令:
string tclCmd = "llength [info args " + tclProcName + "]"; Tcl_Eval(interp, tclCmd.c_str()); int argCount = stoi(Tcl_GetStringResult(interp));
内容的提问来源于stack exchange,提问作者piper

