TCL / C - 何时调用setFromAnyProc()

时间:2012-02-22 02:29:01

标签: c tcl

我正在创建一个新的TCL_ObjType,所以我需要定义4个函数,setFromAnyProc,updateStringProc,dupIntRepProc和freeIntRepProc。在测试我的代码时,我看到了一些有趣/神秘的东西。

在我的测试代码中,当我执行以下操作时:

Tcl_GetString(p_New_Tcl_obj);
调用新TCL对象的updateStringProc(),我可以在gdb中看到它,这是预期的。

奇怪的是,当我执行以下测试代码时:

Tcl_SetStringObj(p_New_Tcl_obj, p_str, strlen(p_str));

我希望调用setFromAnyProc(),但它不是!

我很困惑。为什么不叫它?

1 个答案:

答案 0 :(得分:0)

setFromAnyProc并不像你想象的那么有用。它的作用是将值[*]从具有已填充bytes字段的内容转换为具有已填充bytes字段且有效internalReptypePtr的内容。当需要将泛型转换为特定格式时,它会被调用,特别是Tcl_ConvertToType函数的核心。你可能不会用那个; Tcl本身肯定不会!

这是因为事实证明,您想要进行转换的时间点是特定于类型的访问器或操纵器函数(来自Tcl API的示例包括Tcl_GetIntFromObjTcl_ListObjAppendElement,它们分别是int类型[**]的访问者和list类型的操纵符)。此时,您在代码中必须知道该特定类型的内部的完整详细信息,因此使用通用转换并非真正有用:您可以在必要时直接进行转换(或者将其转换为转换功能)。

Tcl_SetStringObj通过丢弃对象的内部表示(使用freeIntRepProc回调),处理旧的bytes字符串表示(通过Tcl_InvalidateStringRep,或者更确切地说它的内部模拟)然后安装你提供的新bytes

我发现我可以将setFromAnyProc设置的Tcl_ObjType字段保留为NULL,但没有任何问题。


[*]由于历史原因,Tcl_Obj类型的名称错误。这是一个价值。 Tcl_Value被用于其他现在过时且几乎未使用的东西。
[**]整数实际上由一组内部类型表示,具体取决于所需的位数。如果您只是使用它们,则无需了解详细信息,因为访问器功能完全隐藏了复杂性。