尝试将.c文件编译为.cpp时,VS 2013错误C2664

时间:2014-03-12 21:19:13

标签: c++ c visual-studio-2013

我正在为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 *' "

有没有人面对并设法解决任何类似的问题?我错过了一些更深刻的东西吗?

提前谢谢!

2 个答案:

答案 0 :(得分:3)

与C不同,C ++不允许将void指针隐式转换为非void指针。您似乎正在尝试将void指针作为该函数的第一个参数传递,但由于它无法转换为参数类型,因此会发生错误。

您可以通过将void指针直接转换为目标指针类型来解决此问题。

object_alloc(static_cast<t_object*>(p), ...)

(仅供参考,反向转换---无效指针指向无效指针---是标准转换,可以隐式发生。static_cast允许执行反向标准转换序列。)

答案 1 :(得分:2)

在C中,存在从void*到任何数据指针类型的隐式转换。

与C&C的隐式函数声明一起,这意味着在C中投射例如结果不是一个好主意。 malloc,因为缺少标头(没有malloc声明)会隐式声明结果类型为malloc的{​​{1}},并且至少本地代码将编译时没有可见的错误...... :(

在C ++中, int没有隐式转换

因此,在C ++中,不仅应该,而且通常必须投射例如void*

很高兴C ++没有隐式函数声明。 :)


针对您的特定问题的一个很好的解决方案可能是将C文件编译为C(duh)。

但是,请注意,组合C和C ++程序的顶级控件最好是C ++。即将malloc编译为C ++。这是因为C ++有一些额外的运行时库要求,例如动态初始化事物。

不是可以编译为C或C ++的实现文件,而只考虑可以与两种语言一起使用的标头(只有纯声明)。这是做事的常用方法。您可以使用条件main使声明在C ++中也能正常工作。