我正在为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 *' "
有没有人面对并设法解决任何类似的问题?我错过了一些更深刻的东西吗?
提前谢谢!
答案 0 :(得分:3)
您可以通过将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 ++中也能正常工作。