1

我正在尝试将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*)

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

4

3 回答 3

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);

编译器在这里为您提供帮助 - 不要试图通过对它撒谎来解决它。

于 2013-09-06T11:29:04.060 回答
1

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

于 2013-09-06T11:15:55.890 回答
0

尝试:

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

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


如果您要否决这个答案,我很高兴知道原因。我知道如果 user2754070 想要更改原型会更好services(请参阅下面的评论)。但是,我的建议可行(答案已被接受),据我所知,在 C 库中生成线程是安全且标准的做法。如果您认为不是,请解释原因,我会考虑删除答案。

于 2013-09-06T11:14:10.007 回答