奇怪的error C2440错误,难道说C语言与VC不兼容?

agua06 2005-07-04 02:14:29
写了一个dll,目的是读取某种相机的序列号,于是写了如下代码:


char *serialNumber = NULL;
status = ansel.GetAttributeInfo(camera, KPDCSerialNumberStringID, &serialNumType, &serialNumberLen);
if (status != KPDC_OK)
return 0;

serialNumber = malloc(serialNumberLen);


但是编译到上面的最后一句时却抱了这么个错误
c:\program files\microsoft visual studio\myprojects\kodakslr\kodakslr.cpp(103) : error C2440: '=' : cannot convert from 'void *' to 'char *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast


我该如何解决?
...全文
257 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
newbiestar 2005-07-04
  • 打赏
  • 举报
回复
这个问题要从历史的角度去看才能正确理解……

早期的K&R C里面没有void*这个类型,所有需要用void*表示的地方都用的char*(你可以看看早期的memcpy的声明就知道了),但是这样显然语义上面不正确,所以提出了void*来取代char*,作为除去实际意义以后的内存的代表……

并且为了少打一些字(那时候的程序员懒得...),就加上从任意指针类型和void*的互相转换不要强制类型转换语法这一规则。
bobob 2005-07-04
  • 打赏
  • 举报
回复
我是从c++的角度来说这个写法不太规范(严格来说,本身就是错误的写法.void本意就是无类型,又怎么能当作char类型来处理?)不知道规范里面是否这样说,但c对类型检查确实太过简单.

agua06 2005-07-04
  • 打赏
  • 举报
回复
问题已经解决,谢谢大家^-^
newbiestar 2005-07-04
  • 打赏
  • 举报
回复
根本不是这么回事……

void*根本就没有指向类型的大小,而char*是有的,void*虽然实现的是早期的K&R C中的char*的作用,但是实际上类型转换是无法避免的。而且对于void*类型的变量,算术操作是不允许的。

void *p;
p++;//这个会被编译器报告为一个错误
lzzqqq 2005-07-04
  • 打赏
  • 举报
回复
强制转换一下就OK了.
从内存的角度来看 void* 和char* 一样.都是单字节类型的变量
jerry 2005-07-04
  • 打赏
  • 举报
回复
C++标准不允许这样的隐式转换
newbiestar 2005-07-04
  • 打赏
  • 举报
回复
严重不赞成楼上的说法,C里面void*和其他类型的指针之间的互相转换是C语言标准所允许的,根本不是什么不规范……
bobob 2005-07-04
  • 打赏
  • 举报
回复
不是不兼容,而是c语言里面写的不太规范的代码在c++里面会报错
应该加强制转换
newbiestar 2005-07-04
  • 打赏
  • 举报
回复
要么把你的工程里面的文件名改为.c的也可以解决问题
newbiestar 2005-07-04
  • 打赏
  • 举报
回复
C++的类型检查系统比C的严格的多,C允许从void*到任何其他类型的指针的implicit转换,而C++不允许这样的转换存在。

所以需要加上(char*)来进行强制类型转换(或者使用C++推荐的static_cast转换)。
surstar 2005-07-04
  • 打赏
  • 举报
回复
saliors 2005-07-04
  • 打赏
  • 举报
回复
/* Allocate space for a path name */
string = malloc( _MAX_PATH );

// In a C++ file, explicitly cast malloc's return. For example,
// string = (char *)malloc( _MAX_PATH );

说得很清楚了,C++里面,你的程序要改成serialNumber = (char *)malloc(serialNumberLen);
jerry 2005-07-04
  • 打赏
  • 举报
回复
serialNumber = (char*)malloc(serialNumberLen);

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧