C ++类型转换错误

时间:2012-10-04 06:39:44

标签: c++ casting

  

可能重复:
  void pointers: difference between C and C++

您好我有以下功能:

void task2(int a)
{
    printf("  Task 2 running..\n");
    sleep(2);
    printf("  Task 2 exiting..\n");
}

thpool_add_work(threadpool, (void*)task2, (void*)a);

int thpool_add_work(thpool_t* tp_p, void *(*function_p)(void*), void* arg_p)
{
    // some code here
}

上面的代码适用于C,但不能用C ++编译。我收到以下错误:

error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
error:   initializing argument 2 of ‘int thpool_add_work(thpool_t*, void* (*)(void*), void*)’

我无法找出导致此错误的原因。当我将文件扩展名更改为CPP并编译时,不知道为什么会出现这个错误?

2 个答案:

答案 0 :(得分:2)

您必须更改task2的签名以匹配thpool_add_work参数的类型:

void* task2(void* a)

创建线程的调用将变为

thpool_add_work(threadpool, task2, &a);

假设aint

如果您需要使用task2的参数,您可以执行以下操作:

int ia = *(int*)a;

更新以回答OP评论

thpool_add_work期望带有void*参数的函数是有原因的。以这种方式,您可以将任何类型的参数传递给线程函数,尽管是以类型不安全的方式。

您将转换为void*的参数的地址作为thpool_add_work的第三个参数传递。然后,将指向void的指针转回指向预期参数类型的指针,并取消引用它以获取参数的值。我给出了上面int a的示例,现在它将如何寻找浮点数:

void* test3(void* a)
{
float fa = *(float*)a;
.....
return NULL;
}

答案 1 :(得分:0)

试试这个

thpool_add_work(threadpool, (void* (*)(void*))task2, (void*)a);

C会自动将void*转换为任何类型,而C ++则不会。

您可以使用typedef

改进代码
typedef void* (*worker_func_t)(void*);

thpool_add_work(threadpool, (worker_func_t)task2, (void*)a);

int thpool_add_work(thpool_t* tp_p, worker_func_t function_p, void* arg_p)
{
    // some code here
}