Tcl多命名空间变量相互干扰问题:代码错误排查与解决
问题分析与解决
你的代码核心错误在于**uplevel #0强制source在全局命名空间执行**,导致文件内的变量操作直接修改全局变量,完全失去了命名空间的隔离作用。
错误细节
在source_file过程中,uplevel #0 [list source ...]会让source命令在全局命名空间(#0)运行,而非你创建的NC$i命名空间。因此:
file1.tcl里的set A 456修改的是全局变量A,覆盖了初始的123file2.tcl里的puts $A读取的是被修改后的全局变量,自然输出456
修正后的代码
直接让source在目标命名空间内执行,去掉不必要的uplevel #0:
proc source_file { filename } { global i # 用双引号确保变量i被正确替换,创建对应命名空间 namespace eval "NC$i" [list source $filename] incr i } set i 1 set A 123 source_file file1.tcl source_file file2.tcl
修正后效果
file1.tcl里的set A 456会创建并修改NC1::A,全局变量A仍为123file2.tcl在NC2命名空间执行,puts $A会向上查找全局命名空间的A,输出123,符合你的预期
内容的提问来源于stack exchange,提问作者JoshTitle
相关产品推荐
相关产品推荐

