c - 在 TCL 8.4 中,如果 #define NULL 0,TclLib 函数 Tcl_SetHashValue 是否允许值为 NULL?

标签 c tcl hashtable

我已阅读 Tcl_SetHashValue [1] 的文档,但我有一个问题。 TclLib 函数 Tcl_SetHashValue 是否允许在 #define NULL 0 的情况下值为 NULL?

换句话说,给定

#define NULL 0

像下面这样的 Tcl_SetHashValue 调用是否有定义的行为?

Tcl_SetHashValue( someHashEntry, NULL );

如果定义了行为,那么行为是什么?例如,如果执行此代码

Tcl_HashTable myhash;
char *key_arg = 0;
Tcl_HashEntry *entry_arg;
ClientData val_arg;
Tcl_HashEntry *pEntry ;
char *pValue ;

Tcl_InitHashTable( &myhash, TCL_STRING_KEYS);

// store data

key_arg = "someKey";
entry_arg = Tcl_CreateHashEntry( &myhash, key_arg, &isEntryNew );
val_arg = NULL ;
Tcl_SetHashValue( entry_arg, val_arg );

// retrieve data

pEntry = Tcl_FindHashEntry( pArgs, criteria );
if (pEntry)
{
    pValue = Tcl_GetHashValue( pEntry ) ;
}

上面的代码执行后,pEntry和pValue会包含什么?

1 - http://www.tcl.tk/man/tcl8.4/TclLib/Hash.htm

最佳答案

Tcl_SetHashValue(由于历史原因,它是一个宏)设置的值由宏强制转换为ClientData类型。这又是 void * 的 typedef(除了 C89 之前的系统 (!),它是 char *),并具有 promise Tcl 不会将肮脏的手指伸进去;随后的 Tcl_GetHashValue 将准确返回您提供的值。

在示例代码中,pEntry 将有一个指向有效结构的指针,如果条件不匹配,则为 NULL。如果pEntry 不是NULL,则pValue 将放入该值。这里很可能是NULLNULL 是一个非常适合放入的东西,并且由您的代码来理解它可能意味着什么。

<小时/>

Tcl 的更高版本是相同的,但可能对定义进行了修改。当然,我们放弃了对 C89 之前的支持。 (事实上​​,我们这样做是为了在 8.4 中意外地构建 Tcl 本身,并且没有一个用户提示。我们是保守的,但不是那么保守!)

关于c - 在 TCL 8.4 中,如果 #define NULL 0,TclLib 函数 Tcl_SetHashValue 是否允许值为 NULL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669260/

相关文章:

c - 使用 sprintf 打印 size_t 需要多少个字符?

c - 从 Tcl_HashTable 检索对象以销毁对象时出现问题

java - 哈希表的缺点

Java多维散列/矩阵

c - 顶点缓冲区对象 - OpenGL

c++ - 哪种方法最适合从光驱中快速读取文件?

CS50 Mario,代码可以编译,但不会执行任何操作

tcl - 预期脚本操作顺序

tcl - 如何为 tcl 脚本创建日志文件

java - 获取具有多个属性的枚举列表并将它们放入 ArrayList 或 HashMap 中?