2014-03-12 56 views
0

我正在为我的第一个外部编程Max 6编写程序,但有权发生的错误让我失望。我已经爬了一个星期的网络找到解决有问题的问题,但没有运气。有相关当试图将.c文件编译为.cpp时出现VS 2013错误C2664

error C2664: cannot convert parameter 1 from 'X' to 'Y' 

许多议题,但没有一个提出的解决方案是适合我的情况,因为它似乎是一个最大对象具体案件。

更重要的是,我有一个主要的.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

将您的代码粘贴到这里将有助于 – taocp

+0

我们需要查看代码。 –

+0

一些卑微的灵魂,给它一个编辑... –

回答

3

与C不同,C++不允许将void指针隐式转换为非void指针。看起来你试图传递一个void指针作为该函数的第一个参数,但是由于它不能被转换为参数类型,所以会发生错误。

您可以通过将void指针直接投射到目标指针类型来解决此问题。

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

(仅供参考,在反向方向上---非void指针转换为void指针---是一个标准转换和可以隐含发生。static_cast被允许执行标准转换的反向序列)。

+0

'static_cast'不会编译为C.并且只能编译为C++的C文件的想法似乎......好吧,没有意义。 –

+0

没有比试图使用C++编译器编译C更荒谬的了:-P – Brian

+0

将C编译为C++是使用MSVC获取C99的有用子集的唯一方法。 – nwellnhof

2

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

与C的隐式函数声明一起,这意味着在C中,不是一个好主意。 malloc,因为用缺少的头(没有malloc声明),将隐含地结果类型int声明malloc,并且至少局部代码将没有可见的错误编译... :(

在C++中没有隐式转换void*

所以在C++一个不仅应该,但最经常必须转换

令人高兴的是C++没有隐式函数声明。:)

malloc的结果。

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

但是,请注意组合的C和C++程序的顶层控件应该更好地为C++。即将main编译为C++。这是因为C++有一些额外的运行时库需求,比如动态初始化事物。

除了可以编译为C或C++的实现文件之外,还可以考虑只能使用两种语言的标头(只有纯声明)。这是做事情的常用方式。您可以使用条件extern "C"使声明也可以在C++中正常工作。