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

VS 2013 error C2664 when trying to compile a .c file as .cpp

本文关键字:VS 2013 C2664 错误 cpp 编译 文件      更新时间:2023-10-16

我正在为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,至少局部代码将编译没有可见的错误…(

在c++中没有从 void*的隐式转换。

因此,在c++中,不仅应该,而且通常必须强制转换结果,例如:malloc

幸好c++没有隐式函数声明。:)


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

但是,请注意,C和c++结合的程序的顶层控制最好是c++。例如,将main编译为c++。这是因为c++有一些额外的运行时库要求,比如动态初始化。

不要使用既可以编译为C也可以编译为c++的实现文件,而是考虑一个头文件(只有纯声明),它可以在两种语言中使用。这是一种常见的做事方式。您可以使用条件extern "C"来使声明在c++中也能很好地工作。