
[英]Using Tcl_SetChannelOption function when creating TCL C channel
[英]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
字段以及有效的internalRep
和typePtr
。 当Tcl_ConvertToType
想要将通用转换为特定格式时调用它,尤其是Tcl_ConvertToType
函数的核心。 您可能不会用过; Tcl本身当然不会!
这是因为事实证明,要进行转换的点是在特定于类型的访问器或操纵器函数中(Tcl API的示例包括Tcl_GetIntFromObj
和Tcl_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.