在TCL 8.4中,给定#define NULL 0,TclLib函数Tcl_SetHashValue允许值为NULL吗?

时间:2014-03-26 17:55:39

标签: c tcl hashtable

我已经阅读了Tcl_SetHashValue [1]的文档,但我有一个问题。给定#define NULL 0,TclLib函数Tcl_SetHashValue允许值为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

1 个答案:

答案 0 :(得分:1)

Tcl_SetHashValue设置的值(由于历史原因,它是一个宏)由宏转换为ClientData类型。这反过来又是void *的typedef(除了在C89之前的系统(!),它是char *)并具有承诺,Tcl不会戳它的肮脏里面的手指;后续的Tcl_GetHashValue将完全返回您提供的值。

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


Tcl的更高版本是相同的,但可能已经完全修改了定义。当然,我们放弃了C89前的支持。 (事实上​​,事实证明我们这样做是为了偶然在8.4中构建Tcl本身而不是一个用户抱怨。我们保守,但 保守!)