大家好我有這樣的片斷代碼:安全鑄造
void writer(void* param){
if(NULL == param){
return;
}
param = (param_t*)param;
...
}
是安全的代碼,還是不行,參數是從類型param_t *,但我生病做每施法時間,當我在功能上使用它,有人有另一個優雅的解決方案嗎?在此先感謝
大家好我有這樣的片斷代碼:安全鑄造
void writer(void* param){
if(NULL == param){
return;
}
param = (param_t*)param;
...
}
是安全的代碼,還是不行,參數是從類型param_t *,但我生病做每施法時間,當我在功能上使用它,有人有另一個優雅的解決方案嗎?在此先感謝
這是一個奇怪的無操作。
當你定義你說param是void*
類型的函數。
然後,通過演員表將其明確轉換爲param_t*
然後編譯器將該分配隱式轉換爲param_t*
至void*
。
你需要另一個變量
void writer(void *param) {
param_t *internal_param;
if (NULL == param) return;
internal_param = param;
/* ... */
}
你沒有投一個void *到另一個指針類型C.
所以只是做:
void writer(void* param){
param_t *myparam;
if(NULL == param){
return;
}
myparam = param;
...
}
(但爲什麼您使用的參數爲void *無論如何?)
顯而易見的解決方案是避免使用void *
和使用param_t *
代替,如:
void writer(param_t * param)
{
if (param == NULL)
{
return;
}
...
}
您可以刪除空測試,如果你知道那它從來沒有用NULL指針調用。或者,您可以用assert(param != NULL)
替換它。
我懷疑OP是否遵循了某些API所需的函數簽名,例如用於線程啓動功能。因此改變參數類型是不可能的。 – 2011-05-23 20:53:50
即使指針值爲NULL,賦值中的(隱式)轉換也是安全的,所以不需要推遲它。你可以這樣做:
void writer(void* param)
{
param_t* myparam = param;
if (myparam == NULL)
return;
...
}
我只是使用「轉換」(可能與「隱式」):「轉換」是一個「顯式轉換」:) – pmg 2011-05-23 10:45:58
我正在做一些通用的東西!感謝您的回答 – likeIT 2011-05-23 09:11:16