繁体   English   中英

TCL / C-何时调用setFromAnyProc()

[英]TCL/C - when is setFromAnyProc() called

我正在创建一个新的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()被调用,但事实并非如此!

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

setFromAnyProc并不像您想象的那样有用。 它的作用是将value [*]从具有填充bytes字段的内容转换为具有填充bytes字段以及有效的internalReptypePtr Tcl_ConvertToType想要将通用转换为特定格式时调用它,尤其是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被用于已经过时且实际上未使用的其他东西。
[**]整数实际上由一组内部类型表示,具体取决于所需的位数。 如果只使用细节,则不需要知道细节,因为访问器函数完全隐藏了复杂性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM