我已经阅读了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
最佳答案
Tcl_SetHashValue
设置的值(由于历史原因,它是一个宏)由宏强制转换为ClientData
类型。反过来,这是void *
的typedef(在C89之前的系统(!)上是char *
除外),并保证Tcl不会戳破它里面的肮脏手指。随后的Tcl_GetHashValue
将完全返回您提供的值。
在示例代码中,如果条件不匹配,pEntry
将具有指向有效结构或NULL
的指针。如果pEntry
不是-NULL
,则将放置pValue
的值。放入NULL
是一件非常好的事情,这取决于您的代码来理解这可能意味着什么。
Tcl的更高版本是相同的,但可能完全修改了定义。并且可以肯定的是,我们放弃了C89之前的支持。 (实际上,事实证明,我们这样做是出于偶然在8.4中构建Tcl本身的,没有一个用户抱怨。我们很保守,但并不那么保守!)
关于c - 在TCL 8.4中,给定#define NULL 0,TclLib函数Tcl_SetHashValue是否允许将值设为NULL?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22669260/