2014-03-26 31 views
0

我已閱讀Tcl_SetHashValue [1]的文檔,但我有一個問題。給定#define NULL 0,TclLib函數Tcl_SetHashValue允許值爲NULL嗎?在TCL 8.4中,TclLib函數Tcl_SetHashValue的允許值爲NULL,給定#define NULL 0?

換句話說,鑑於

#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

Tcl_SetHashValue(這是一個宏,由於歷史原因)的設置值由宏投是ClientData類型。這又是一個void *的typedef(在C89以前的系統(!)除外,它是一個char *)並且有承諾 Tcl不會在其內部捅骯髒的手指;隨後的Tcl_GetHashValue將返回您提供的值。

在您的示例代碼中,如果條件不匹配,pEntry將具有指向有效結構的指針或NULL。如果pEntry爲非NULL,則pValue將具有放置的值。這可能是NULL; NULL是一個非常好的東西,它取決於您的代碼,以瞭解可能意味着什麼。


Tcl的更新版本是相同的,但可能已經精確定義了什麼定義。當然,我們放棄了對C89的支持。 (事實上​​,事實證明我們這麼做是因爲意外建造Tcl本身,而不是一個用戶抱怨。我們保守,但不是保守!)