C++中的显式类型转换

Explicit type casting in C++

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

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

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

解决方案是使用正确类型的函数,而不是强制转换它们。如果参数与代码无关,请忽略该参数。

void services(void*);
void transfers(void*);
_beginthread(services, 0, NULL);
_beginthread(transfers, 0, NULL);
如果您

绝对无法更改函数,例如,如果您无法访问源代码,请使用包装器:

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

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

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

尝试:

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

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


如果你要对这个答案投反对票,我很想知道原因。 我知道如果用户 2754070 想更改services的原型会好得多(请参阅下面的评论)。 但是,我的建议是有效的(答案被接受了),据我所知,这是生成线程的 C 库中安全和标准的做法。 如果您认为不是,请解释原因,我会考虑删除答案。