C++类型转换错误

C++ typecast error

本文关键字:错误 类型转换 C++      更新时间:2023-10-16

可能的重复项:
空指针: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 并进行编译时会出现此错误吗?

您必须

更改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;
}

试试这个

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
}