2011-05-23 38 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