C ++中的显式类型转换

时间:2013-09-06 11:09:06

标签: c++ casting void-pointers explicit-conversion

我正在尝试将C代码转换为C++。在我的.c文件中,我有这样的定义:

void services(void);
void transfers(void);

此外,一个线程会像这样初始化上面两个:

_beginthread((void*) services,0,NULL);
_beginthread((void*) transfers,0,NULL);

当我尝试编译时,我在上面的两个地方都出现了以下错误:

Conversion from void* to pointer to non-void required an Explicit cast: Cannot convert parameter 1 from void* to void(_cdecl*)(void*)

我对此感到困惑,希望你们为我说清楚: - )

3 个答案:

答案 0 :(得分:3)

解决方案是使用正确类型的函数,投射它们。如果参数与代码无关,请忽略该参数。

void services(void*);
void transfers(void*);

_beginthread(services, 0, NULL);
_beginthread(transfers, 0, NULL);

如果您绝对无法更改功能,例如如果您无权访问源,请使用包装器:

void correct_services(void*) { services(); }
_beginthread(correct_services, 0, NULL);

编译器在这里帮助你 - 不要试图通过说谎来解决它。

答案 1 :(得分:1)

看起来您正在尝试将C ++调用标准转换为C调用标准。 cdecl代表C声明。 要手动将函数定义为cdecl,可以使用void _cdecl funct();

答案 2 :(得分:0)

尝试:

_beginthread((void(_cdecl*)(void*)) services, 0, NULL);

您正在做的是将函数指针显式地转换为非函数指针类型(void *)。这没关系。但是_beginthread函数需要将第一个参数作为错误消息中提到的正确类型的函数指针。所以你需要修复你的演员。


如果你想要回答这个问题,我很高兴知道原因。我知道如果user2754070想要更改services的原型会更好(请参阅下面的评论)。但是,我建议的工作(答案被接受),据我所知,它是C库产生线程的安全和标准做法。如果您认为不是,请解释原因,我会考虑删除答案。