大家好我有这样的片断代码:安全铸造
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