【问题标题】:C++ typecast error [duplicate]C ++类型转换错误[重复]
【发布时间】:2012-09-25 03:45:06
【问题描述】:

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

【问题讨论】:

  • 您需要发布更多代码——例如函数和对象的声明。
  • 这不是因为void*C 中可以隐式转换,但在C++ 中却不能?
  • 在 C++ 中,将数据指针(即void*)转换为函数指针(即void* (*)(void*))是不合法的。然而,许多编译器会让你摆脱这一点。当您致电 thread_add_work 时,我会删除或调整您对 task2 的演员表。我还会删除a(void*) 演员表,这似乎没有任何作用。过多的演员表总是一个不好的迹象,它只是隐藏了错误
  • 什么是task2?是函数吗?
  • 刚刚更新了问题中task2的内容

标签: c++ casting


【解决方案1】:

试试这个

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
}

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

    • task2 需要将其转换为 int,task3 需要将 void* 转换为 float。我不确定将参数更改为 void* a 会有什么帮助。能详细点吗?
    • @webgenius:答案更新了
    猜你喜欢
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2015-09-03
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多