从VC6迁移到VS2005 - METHOD

本文主要探讨了在使用VC编译器过程中常见的编译错误,包括默认构造函数缺失、使用未初始化变量等问题,并提供了具体的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.error C2512: 'CMyClass' : no appropriatedefault constructor available

VC需要默认构造函数(显性),而JAVA不用。

2. 增加_s后缀的函数

a.1) sprintf

int sprintf(

char *buffer,

const char *format [,

argument] ...

);

a.2) sprintf_s

int sprintf_s(

char *buffer,

size_t sizeOfBuffer,

const char *format [,

argument] ...

);

b.1) strcpy

char *strcpy(

char *strDestination,

const char *strSource

);

b.2) strcpy_s

errno_t strcpy_s(

char *strDestination,

size_t sizeInBytes,

const char *strSource

);

3.Run-Time Check Failure #3 - The variable 'comstat' is being usedwithout being initialized.

VC6以后版本的增强功能。

解决办法

增加memset(&comstat, 0, sizeof(COMSTAT) );既可。

下列两种方法未试!

方案1: 改变项目配置属性


一种解决方案是改变基本运行时检查(changing the runtimechecks in project settings):在菜单Project->Project properties-> C/C++ -> Code generation-> BasicRuntime checks --> change to 'Default',在中文版中是:项目-〉属性-〉配置属性-〉C/C++代码生成-〉基本运行时检查-〉设置为默认,当将基本运行时检查改为默认之 后,编译自然顺利通过了,向串口调试助手发送消息正常了,再从串口调试助手向SerialPortTest发送消息时,也正常了。


方案2:改变comstat变量属性


另一种解决方案是将CSerialPort.CPP中的COMSTAT comstat;改为static COMSTAT comstat;这样改了之后,debug顺利通过,然后调试,与串口调试助手相互发消息都OK了。为什么这样就能解决呢?其实当你使用debug解决方 案时,它的基本运行时检查初始设置为:两者(/RTC1,等同于 /RTCsu),这个两者是指:堆栈帧(/RTCs),未初始化的变量(/RTCu)。由于它要检查未初始化的变量,所以将SerialPort.cpp 中的COMSTAT comstat;改为static COMSTAT comstat;就可以正常使用CSerialPort类了。
以上是在debug下的解决方案,当在Release编译状态时,你会发现并不需要将COMSTAT comstat;改为static COMSTAT comstat;就能编译成功并且发送接收消息正常。其实,在Release下,它的基本运行时检查初始设置已为默认。这应该也算是第一种解决方案之内。
而当你将它设置为两者(/RTC1,等同于 /RTCsu)时,不论是否将COMSTAT comstat;改为static COMSTAT comstat;,编译都不能通过,报错““cl.exe”返回的结果有误。",这个应该是属于Release的问题了,另当别论了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值