我已经阅读了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会包含什么?
答案 0 :(得分:1)
Tcl_SetHashValue
设置的值(由于历史原因,它是一个宏)由宏转换为ClientData
类型。这反过来又是void *
的typedef(除了在C89之前的系统(!),它是char *
)并具有承诺,Tcl不会戳它的肮脏里面的手指;后续的Tcl_GetHashValue
将完全返回您提供的值。
在示例代码中,如果条件不匹配,pEntry
将指向有效结构或NULL
。如果pEntry
不是NULL
,则pValue
会将值放入。这里可能是NULL
; NULL
是一个非常好的东西,并且由您的代码来理解这可能意味着什么。
Tcl的更高版本是相同的,但可能已经完全修改了定义。当然,我们放弃了C89前的支持。 (事实上,事实证明我们这样做是为了偶然在8.4中构建Tcl本身而不是一个用户抱怨。我们保守,但 保守!)