我的目标是做一个列表,但在C中,与Tcl API的帮助。
- Tcl* 循环:
set listObj {}
for {set i 0} {$i < 10} {incr i} {
set data {}
lappend data int $i
lappend listObj $data
}
# result : {{int 0} {int 1} {int 2} {int 3} {int 4} {int 5} {int 6} {int 7} {int 8} {int 9}}
- C* 回路:
Tcl_Obj *listObj = Tcl_NewListObj (0,NULL);
for (int i = 0; i < 10; i++) {
Tcl_Obj* data = Tcl_NewObj();
Tcl_ListObjAppendElement(interp, data, Tcl_NewStringObj("int", 3));
Tcl_ListObjAppendElement(interp, data, Tcl_NewIntObj(i));
Tcl_ListObjAppendElement(interp, listObj, data);
}
它可以正常工作,但我不知道C代码中的data
是否正确使用。在Tcl中,我使用{}
来重置变量。
我的问题:如何在Tcl API的帮助下正确重置Tcl_Obj
?
1条答案
按热度按时间nwo49xxi1#
您的代码没有问题。
data
变量只是一个指向Tcl_Obj的指针。当它最初使用Tcl_NewObj()创建时,该Tcl_Obj的refCount为0。通过将其追加到listObj,Tcl_ListObjAppendElement()会将refCount递增到1。此时,Tcl_Obj实际上被传递到listObj列表。如果你想卖弄学问,可以在创建新的Tcl_Obj之后使用
Tcl_IncrRefCount(data)
,然后使用Tcl_DecrRefCount(data)
放弃对它的声明。这将显式地重置变量。但是由于你的代码没有做任何可能过早释放变量的事情,所以你可以安全地省略这两个调用。