当试图将.c文件编译为.cpp时,VS 2013错误C2664
VS 2013 error C2664 when trying to compile a .c file as .cpp
我正在为Max 6编程我的第一个外部,但标题错误阻碍了我。我已经爬了一个星期的网络找到一个解决方案的标题问题,但没有运气。有许多与
相关的话题error C2664: cannot convert parameter 1 from 'X' to 'Y'
但是没有一个建议的解决方案适合我的情况,因为它似乎是一个特定于Max对象的情况。
更重要的是,我有一个主要的。c文件用于我的外部,它使用各种其他。cpp文件和库。因此,我想将其编译为.cpp文件。据我所知,这应该没有问题。然而,当我试图在Visual Studio中编译它时,我得到以下错误:
error C2664: 't_object *object_alloc(t_object *,const char *,...)' : cannot convert argument 1 from 'void *' to 't_object *' "
有人遇到过类似的问题吗?是不是我错过了更深刻的东西?
提前感谢!
c++与C语言不同,不允许将void指针隐式转换为非void指针。似乎你正试图传递一个void指针作为该函数的第一个参数,但由于它不能转换为参数类型,出现错误。
可以通过直接将void指针强制转换为目标指针类型来解决这个问题。
object_alloc(static_cast<t_object*>(p), ...)
(仅供参考,反向转换——非空指针到空指针——是一种标准转换,可以隐式发生。static_cast
允许执行标准转换序列的反向)
在C语言中有一个从void*
到任何数据指针类型的隐式转换。
与C的隐式函数声明一起,这意味着在C中转换结果例如malloc
不是一个好主意,因为缺少头(没有malloc
声明)将隐式声明malloc
与结果类型int
,至少局部代码将编译没有可见的错误…(
void*
到的隐式转换。
因此,在c++中,不仅应该,而且通常必须强制转换结果,例如:malloc
。
幸好c++没有隐式函数声明。:)
对于您的特定问题,一个好的解决方案可能是将C文件编译为C (duh)。
但是,请注意,C和c++结合的程序的顶层控制最好是c++。例如,将main
编译为c++。这是因为c++有一些额外的运行时库要求,比如动态初始化。
不要使用既可以编译为C也可以编译为c++的实现文件,而是考虑一个头文件(只有纯声明),它可以在两种语言中使用。这是一种常见的做事方式。您可以使用条件extern "C"
来使声明在c++中也能很好地工作。
- 构建在VS 2013中找不到平台工具集= 'v141'
- MFC 对话框属性表用法在 VS 2017 中产生错误,适用于 VS 2013
- VS 2013 和 VS 2015 的不同C++可再发行 DLL
- 错误的LNK2005已定义为将C /Fortran解决方案更新为VS 2013
- VS 2013 SFINAE 缺陷的解决方法
- 与openCV的vs 2013中的lib链接
- VS 2013 DirectX Project Vertex着色器文件缺失
- VS 2013 errorC3861 PeekMessage etc and errorC2065 WNDCLASSEX
- 以下代码在 VS 2013 发布/调试中生成不同的结果
- VS 2013 社区 - 创建代码片段
- 如何使Ws2_32.lib与针对Windows 8.1的VS 2013项目协同工作
- VS 2013模板无法编译
- 最好的方法太分开类,VS 2013
- OpenGL未解析的外部符号VS 2013
- 无法在VS 2013、Windows 8.1中创建Win32控制台应用程序
- 禁用CPP中某部分代码的代码分析(VS 2013)
- C++ IDE 从 VS 6 迁移到 VS 2013
- 谷歌测试预构建VS 2013
- 闪电战在 vs 2013 中不起作用
- 使用 C++ 在 directX 11 中的 VS 2013 中获取 LNK 2019 错误