【发布时间】:2015-10-08 12:47:49
【问题描述】:
c++代码中很多地方。internalRep.twoPtrValue.ptr1用于获取Tcl_Obj*。
这到底是什么以及为什么在 C++/Tcl 实现中使用它。 我正在使用遗留代码,无法理解它的用途。 谁能解释一下
【问题讨论】:
c++代码中很多地方。internalRep.twoPtrValue.ptr1用于获取Tcl_Obj*。
这到底是什么以及为什么在 C++/Tcl 实现中使用它。 我正在使用遗留代码,无法理解它的用途。 谁能解释一下
【问题讨论】:
Tcl 库在内部使用Tcl_Obj 类型来表示解释器中的值。根据原始语言规范“一切都是字符串”,它必须能够保存值的字符串表示形式,但还要根据类型缓存各种内部值。该库在其中一个字段 (internalRep) 中定义了一个联合,并通过联合成员访问所持有的特定类型。对于某些类型,保存两个指针值是有意义的,因为联合中已支持这一点,您将获得您要查询的代码。
更一般地说,内部表示仅由在 Tcl 中定义此对象类型的Tcl_ObjType 结构定义的函数使用。您应该检查这些函数如何使用这些指针值。
【讨论】:
Tcl_Obj 的内部表示是根据typePtr 字段所指向的定义解释值的持有者。例如,如果一个值为1.25 并且已被解释为双精度浮点数,则typePtr 将指向常量tclDoubleType 结构,而内部表示的doubleValue(总体上是一个@ 987654327@) 将被使用。
有些类型使用两指针内部表示;这些指针的含义取决于类型。例如,对于列表,第一个指针用于指向列表中的值数组(加上一些元数据),第二个指针通常为 NULL,但在进行复杂的嵌套更新时是其他东西。但是ptr1 本身只是一个原始指针。对象类型的实现决定了应该使用什么类型转换。
(Tcl 的类型系统完全与 C++ 的不同。它也是一个 C 库;它做的事情通常在 C++ 中被认为是糟糕的做法,因为它们不安全。但它们'在 Tcl 的实现中安全使用。)
【讨论】: