如何在tclsh中移除命令?C++定义命令的关联疑问
Tcl命令重命名与C++实现关联问题解答
1. rename myproc ""能否完全移除myproc命令?
是的,这个操作会从Tcl解释器中完全移除myproc命令的可见性。在Tcl的规则里,将命令重命名为空字符串等同于删除该命令的名称绑定:
- 从脚本层面看,
myproc这个命令名不再可用,调用会提示"invalid command name"; - 对于通过
Tcl_CreateObjCommand注册的C++实现,Tcl会解除myproc名称与myproc_func的关联。如果该命令没有其他未释放的内部引用(比如未销毁的别名),Tcl会清理掉对应的命令对象结构。
唯一例外:如果你的C++代码自行保存了Tcl_CreateObjCommand返回的Tcl_Command句柄,那myproc_func函数本身不会被销毁,但从Tcl脚本和常规命令接口中,已经无法再通过myproc名称调用它。
2. 重新定义同名myproc能否关联到原C++实现?
不能。执行rename myproc ""后,原名称与C++函数的绑定关系已被彻底切断,没有任何残留的关联:
- 如果通过Tcl脚本用
proc myproc {args} {...}重新定义,新的myproc是一个独立的脚本命令,和原C++实现毫无关系; - 如果再次调用
Tcl_CreateObjCommand注册同名命令,这是一次全新的绑定操作——即便你传入同一个myproc_func,也只是重新建立了名称与函数的关联,并非恢复之前的绑定。
换句话说,删除命令后,原关联不存在了,重新定义要么是新的脚本命令,要么是新的C命令注册,不会自动关联到之前的实现。
内容的提问来源于stack exchange,提问作者piper
相关产品推荐
相关产品推荐

