C++中的显式类型转换
Explicit type casting in C++
我正在尝试将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 库中安全和标准的做法。 如果您认为不是,请解释原因,我会考虑删除答案。
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 事件系统:使用类型转换或联合进行继承
- 如何在参数中定义隐式类型转换的构造函数?
- 类模板实例化中的类型转换