我已经阅读了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/

10-11 22:55
查看更多