2

可能重复:
void 指针:C 和 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 并编译时会出现此错误吗?

4

2 回答 2

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;
}
于 2012-10-04T06:53:47.580 回答
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
}
于 2012-10-04T06:49:32.417 回答