从Tcl_Obj获取指针的地址

问题描述 投票:0回答:1

与我的问题有关。 我现在尝试在另一个函数中获取这个值。
到目前为止,我主要使用

Tcl_Obj
来检索 :

  • 字符
  • 列出值
  • 等等...

但不是指针的地址。根据 Tcl API ,这样的函数不存在(我认为......)。
网上没有太多的例子(最重要的是,我不知道在哪里/寻找什么),我认为这个页面(Tcl Handles)可能有帮助,但我不确定。
谁能给我一些指导吗?

注意:我不知道这是否重要,我正在使用critcl(我认为理念是相同的,希望如此!).

c tcl
1个回答
0
投票

您可以将指针转换为整数(首先转换为

intptr_t
),然后将整数转换为指针,这样就可以了。但这是极其不安全的;没有好的方法可以直接验证这些事情!但有些事情你可以做。

验证的最低级别是用名称来假装指针编号(可能是从它所指向的事物的名称派生出来的?),这样您就不会意外地将它们完全混淆;您可以在解析值时轻松检查这一点。许多 Tcl 扩展都是这样做的。

更高级别的验证是在 Tcl 解释器中存储哈希表(作为命令的客户端数据或通过

Tcl_SetAssocData
)并使用它来检查来自脚本的值是否是给定的值,并且尚未失效(当您释放它指向的东西时通常会失效)。就像指针可以通过脚本传递一样,但只能作为不透明值传递。 (我在那个 wiki 页面上的旧代码正在做一种更高级的形式,将映射缓存在句柄标记本身中。)Tcl 为其在 Windows 上的本机通道句柄做了一些非常类似的事情(其他平台使用 FD 代替) ). (如果您有这样的表格,则可以轻松列出当前已知的值作为自省的起点。)

对此的一个轻微扩展是使用计数器(或 RNG,如果您愿意)来生成这些句柄名称的变化部分,而不是指针部分本身。就像这样,你根本不可能在不使用安全检查的情况下进行映射……但这通常是没有必要的。这就是合成通道(参见

chan create

)创建句柄的方式。 (TclOO

似乎
可以做到这一点,但也可以做其他事情;里面有更多的活动部件。) 这里要注意的主要事情是,当您删除映射所指向的值(或以其他方式使其不可用)时,您需要停止映射工作。 Tcl 不提供垃圾收集方面的帮助(您可以对它进行一些欺骗,相当多的代码可以做到这一点,但它在形式上很脆弱并且不受支持)。显式删除是官方首选的方法。

© www.soinside.com 2019 - 2024. All rights reserved.