2011-05-23 85 views
0

大家好我有這樣的片斷代碼:安全鑄造

void writer(void* param){ 
    if(NULL == param){ 
     return; 
    } 
    param = (param_t*)param; 
... 
} 

是安全的代碼,還是不行,參數是從類型param_t *,但我生病做每施法時間,當我在功能上使用它,有人有另一個優雅的解決方案嗎?在此先感謝

回答

5

這是一個奇怪的無操作。

當你定義你說param是void*類型的函數。
然後,通過演員表將其明確轉換爲param_t*
然後編譯器將該分配隱式轉換爲param_t*void*

你需要另一個變量

void writer(void *param) { 
    param_t *internal_param; 

    if (NULL == param) return; 
    internal_param = param; 
    /* ... */ 
} 
2

你沒有投一個void *到另一個指針類型C.

所以只是做:

void writer(void* param){ 
    param_t *myparam; 
    if(NULL == param){ 
     return; 
    } 
    myparam = param; 
... 
} 

(但爲什麼您使用的參數爲void *無論如何?)

+0

我正在做一些通用的東西!感謝您的回答 – likeIT 2011-05-23 09:11:16

1

顯而易見的解決方案是避免使用void *和使用param_t *代替,如:

void writer(param_t * param) 
{ 
    if (param == NULL) 
    { 
    return; 
    } 

    ... 
} 

您可以刪除空測試,如果你知道那它從來沒有用NULL指針調用。或者,您可以用assert(param != NULL)替換它。

+0

我懷疑OP是否遵循了某些API所需的函數簽名,例如用於線程啓動功能。因此改變參數類型是不可能的。 – 2011-05-23 20:53:50

2

即使指針值爲NULL,賦值中的(隱式)轉換也是安全的,所以不需要推遲它。你可以這樣做:

void writer(void* param) 
{ 
    param_t* myparam = param; 

    if (myparam == NULL) 
    return; 

    ... 
} 
+1

我只是使用「轉換」(可能與「隱式」):「轉換」是一個「顯式轉換」:) – pmg 2011-05-23 10:45:58