大家好,我有这段代码:
void writer(void* param){
if(NULL == param){
return;
}
param = (param_t*)param;
...
}
它是安全的代码,或者不是,param来自类型param_t *,但是当我在函数中使用它时,我每次都在做什么生病,有人有另一个优雅的解决方案吗?提前谢谢
答案 0 :(得分:5)
这是一个奇怪的无操作。
定义函数时,您说param的类型为void*
然后,使用演员表,您明确地将其转换为param_t*
并且编译器使用赋值隐式地将param_t*
转换为void*
。
您需要另一个变量
void writer(void *param) {
param_t *internal_param;
if (NULL == param) return;
internal_param = param;
/* ... */
}
答案 1 :(得分:2)
您不必将void *转换为C中的另一个指针类型。
所以就这样做:
void writer(void* param){
param_t *myparam;
if(NULL == param){
return;
}
myparam = param;
...
}
(但你为什么还要为参数使用void *?)
答案 2 :(得分:2)
即使指针值为NULL,赋值中的(隐式)强制转换也是安全的,因此不需要推迟它。你可以这样做:
void writer(void* param)
{
param_t* myparam = param;
if (myparam == NULL)
return;
...
}
答案 3 :(得分:1)
显而易见的解决方案是避免使用void *
并改为使用param_t *
,如:
void writer(param_t * param)
{
if (param == NULL)
{
return;
}
...
}
如果知道它从未使用NULL指针调用,则可以删除NULL测试。或者,您可以将其替换为assert(param != NULL)
。