VS2003=>VS2005在VC上的一些变化

【扫地机器人测试】 本测试方案旨在系统性评估扫地机器人的核心功能、性能指标、可靠性及用户体验,验证产品是否符合设计规范、行业标准及市场需求。通过多维度、全场景的测试,精准定位产品缺陷与优化空间,为产品迭代提供数据支撑,确保上市产品的质量稳定性与用户满意度。 阅读详情
最近, 找到一个界面库. 想把它转化为VS2005下编译, 岂知出现了NNNNNNNNN个错误!!!这才恍然大悟: VS2003到VS2005在VC上还是改动了不少!!!下面是对这些变化的总结: 1. 变量作用域 在vc7.1中, 如果一个变量定义在for语句的条件从句中,那么这个变量可以在for之后使用。但Vc8禁止这样,会报告一个C2065错误.
for (int i = 0; i < 10; ++i)   {                                 //codes here } if (i < 10).. //error in Vc8 for (i = 0; i < 5; ++i) //error in Vc8

解决方法:在for语句之前声明变量(可保证代码在vc7.1和vc8下同时编译通过)

int i =0;                     for (i = 0; i < 10; ++i) for (i = 0; i < 5; ++i)

2. 指针和引用的声明 在Vc7.1中, 下面的代码可以编译, 但是vc8会报C4430 错误。(很难想象有些美国程序员竟然这样声明)

const & int a; //error in VC8 const * int b;  //error in VC8 int myfun (const & B); //error in VC8

解决方法:把* 或&放到类型的后面.

const int& a;  const int* b; int myfun (const B&);

3. 默认int类型 在vc7.1中,如果定义一个变量但不声明类型,那么默认为int。VC8不支持。

static i = 0; // C4430 error in Vc8  const i = 0; //C4430 error

解决方法:加上int.

static int i = 0;  const int i = 0;

4. 函数的默认返回值类型 同上,VC8不支持把 int 作为默认返回值类

Func() {return 0;}; //error in VC8

解决方法:明确声明函数返回值类型为 int.

int Func() {return 0;};

5. 函数地址 Vc7中函数名就是地址。在vc8中,必须要使用&操作符同时写出这个方法的全名(fully qualified name).

class A { public:      int Test(void); }; void fun(int (A::*test) (void)); int main()  {      fun(A::Test);//C3867 error in VC      return 0; }

解决方法:加上 &.

fun(&A::Test);

6. 隐式类型转换 VC8不允许B* 到const B*&的隐式转换.

class B{}; void fun ( const B* & );//if possible use const B* instead int main()  { B *test = new B(); fun (test); //error in VC8 return 0; }

解决方法:强制转换或函数参数变成const B*。

void fun ( const B*  );

7. 友元方法(Friend function) VC8不允许声明一个private或protected函数为友元.

class A { private:  void c();   }; class B {   friend void A::c(); //C2248 error, c() is invisible to class B. };

解决方法 1: 声明友元类.

class A { private:  void c();   }; class B {   friend class A; };

解决方法 2: 把函数声明为public

class A { public:  void c();   }; class B {   friend void A::c(); };

8. STL的stdext 命名空间 在vc8中,hash_map 和hash_set 被移进了stdext命名空间中.

#include <hash_map> std::hash_map //error in VC8

解决方法:使用stdext 命名空间.

#include <hash_map> stdext::hash_map

9. 头文件 许多头文件如fstream.h 和iostream.h在VC8中已经不存在了.

#include <fstream.h> //error in VC8

解决方法:使用STL.

#include <fstream>

10. Iterator 一些 STL 类, iterators 不再用指针实现

std::vector<DMDetailRow> m_data; std::vector<DMDetailRow>::iterator iter = &m_data[rowNum];

解决方法:

std::vector<DMDetailRow>::iterator Iter = m_data.begin() + rowNum;

11. Enum 使用一个Enum的成员时,不要使用enum的名字

enum E {   a,b,c }; E e1 = E::a; //warning in VC8

解决方法:去掉Enum 的名字.

E e1 = a; 此外, 还发现了不少函数声明方面的变化:①ON_WM_NCHITTEST()出现下列错误: 错误 33 error C2440: “static_cast”: 无法从“UINT (__thiscall CGuiControlBar::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)” ../guilib1.5/guilib/guicontrolbar.cpp 101 *需要使用LRESULT才行!
②错误 22 error C3861: “tstrlen”: 找不到标识符 ../guilib1.5/guilib/guitabwnd.cpp 458 *在新的MSDN查不到strlen,使用 _tcslen ③错误 31 error C2664: “strcpy”: 不能将参数 1 从“WCHAR [32]”转换为“char *” ../guilib1.5/guilib/guidocktoolbarex.h 26 改为_tcscpy,*看来在VS2005中处理字符串时不能再像以前那样直接用C风格的了,还是用T形式的吧,既然strcpy要用_tcscpy,其它的字符串函数估计也只好用_tcsxxx了
此外, 还发现了不少函数声明方面的变化:①ON_WM_NCHITTEST()出现下列错误: 错误 33 error C2440: “static_cast”: 无法从“UINT (__thiscall CGuiControlBar::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)” ../guilib1.5/guilib/guicontrolbar.cpp 101
*需要使用LRESULT才行! 这个怎么处理啊?怎么使用LRESULT? ------------------------------------------------------------ ------------------------------就拿这个CGuiControlBar来说,它继承自CWnd,而在VC6.0和VC7.1中,CWnd::OnNCHitTest函数的返回值为UINT(在VC8.0中它的返回值改成了LRESULT),当CGuiControlBar重写(Override)这个OnNCHitTest函数的时候,它的返回值也声明为UINT(因为写代码的时候还是针对VC6.0或VC7.1),当在VC8.0中扩展ON_WM_NCHITTEST()宏时,就会出现上面的错误,所以你需要做的只是把CGuiControlBar::OnNCHitTest的返回值声明为LRESULT即可,它只不过是个LONG_PTR(长指针)。
此外, 还发现了不少函数声明方面的变化:①ON_WM_NCHITTEST()出现下列错误: 错误 33 error C2440: “static_cast”: 无法从“UINT (__thiscall CGuiControlBar::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)” ../guilib1.5/guilib/guicontrolbar.cpp 101
*需要使用LRESULT才行! 这个怎么处理啊?怎么使用LRESULT? ------------------------------------------------------------ ------------------------------就拿这个CGuiControlBar来说,它继承自CWnd,而在VC6.0和VC7.1中,CWnd::OnNCHitTest函数的返回值为UINT(在VC8.0中它的返回值改成了LRESULT),当CGuiControlBar重写(Override)这个OnNCHitTest函数的时候,它的返回值也声明为UINT(因为写代码的时候还是针对VC6.0或VC7.1),当在VC8.0中扩展ON_WM_NCHITTEST()宏时,就会出现上面的错误,所以你需要做的只是把CGuiControlBar::OnNCHitTest的返回值声明为LRESULT即可,它只不过是个LONG_PTR(长指针)。

 

【回眸】Tessy集成测试软件使用指南(一)新手使用篇 这个专栏的文章前4篇都在记录如何使用Tessy进行单元测试,集成测试需要有一定单元测试基础,且做集成测试之前,需要做好单元测试,否则将会大幅增加软件单元代码纠错的代价。集成测试所花费的时间通常远远超过单元测试。如果直接从单元测试到系统测试,结果往往是不理想的。集成测试可以检测由于单元相互交互而导致的错误,通常由一组专业的测试人员执行。 阅读详情

相关推荐

电路研究9.4——合宙Air780EP的LuatOS、CSDK跟标准AT

 C-SDK、AT指令、LuatOS

esmember的博客 1116

C语言中标识符的作用域、链接属性、存储类型(关键字static、extern、auto和register四个关键字)

标识符 标识符,就是函数名称(例如int select(void);select就是标识符);数据名称(例如int _t=5;t就是标识符) C语言规定标识符只能由数字、字母和下划线组成,并且不能是C语言的关键字,而且不能以数字开头(例如int while=5;就会出错)具体见https://baike.baidu.com/item/%E6%A0%87%E8%AF%86%E7%AC%A6/7105...

qq_42691105的博客 870

移远EC800M CAT1模块HTTP POST实战:从AT指令到OneNet平台数据上报(附STM32代码)

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报到OneNet平台的完整流程,包含STM32实战代码。内容涵盖PDP上下文激活、HTTP服务配置、JSON数据包构建等关键技术要点,并提供硬件连接、状态机设计和错误处理等实用方案,助力开发者快速实现物联网设备稳定数据传输。

weixin_42565652的博客 506

找不到标识符问题

复习动态数组时,出现了找不到标识符的问题,原因是cpp编译时是“顺序编译”的,主函数调用vector_2()函数的时,vector_2()在它所调用的函数printfV()的定义之前,因此找不到标识符。 将两函数调换顺序即可编译通过 (标识符:标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称,用它来命名程序正文中的一些实体,比如函数名、变量名、类名、对象名等。) ...

CS654的博客 1万+

python DEA: 基于非径向距离NDDF的Malmquist-Luenberger 指数及其分解

点赞发Nature 关注中Science Malmquist-Lenberger指数(ML指数)是距离函数与DEA计算中常用的指数,ML指数可以进一步分解为技术进步technological progress和效率改善effeciency change. 技术进步常被当做增长模型中的全要素生产率,用到许多计量经济研究中,探讨影响技术进步的环境变量。这里我分享一个考虑非期望产出下的NDDF方法计算ML指数。 该ML指数为global ML(区别于sequential ML) import numpy as

Cmmmmm丶的博客 5295

【YOLOv11改进- 主干网络】YOLOv11+WTConv(ECCV2024): 基于YOLOv11的主干网络改进,大感受野的小波卷积

论文提出了WTConv,这是一个使用级联小波分解的层,并执行一组小卷积核的卷积,每个卷积专注于输入的不同频率带,并具有越来越大的感受野。这个过程能够在输入中对低频信息给予更多重视,同时仅增加少量可训练参数。实际上,对于一个  的感受野,可训练参数数量只随着  的增长而呈对数增长。而WTConv与常规方法的参数平方增长形成对比,能够获得有效的卷积神经网络(CNN),其有效感受野(ERF)大小前所未有。

qq_41304809的博客 1401

c语言报错找不到标识符,error C3861: “_T”: 找不到标识符

头天好好的程序,第二天一早就报错,还是莫名其妙的错误:atlconv.h等头文件中的“_T” 报错,百思不得其解,各种搜索而不得,整个人都崩溃了。出问题一定是有原因的,后来冷静下来,缕缕思路,逐一排查。有一点可以确定:程序本身是没问题的,出错是在字符集,因为备份的程序也报同样的错误。既然在atlconv.h等头文件中,试试替换VS安装目录中的atlmfc目录下的这些文件。虽然这些文件是VS自带的a...

weixin_35591736的博客 2656

基于深度学习的农作物病虫害检测识别系统:YOLOv8 + UI界面 + 数据集

该系统的目标是使用YOLOv8模型自动检测农作物的病虫害,并通过UI界面提供实时反馈。用户可以通过上传图像,系统会输出图像中是否存在病虫害以及具体种类。数据集准备与处理:收集并准备包含农作物病虫害图像的数据集,并进行标注和数据增强。YOLOv8模型训练:使用YOLOv8训练农作物病虫害检测模型。UI界面设计与开发:开发一个用户友好的界面,支持上传图像并展示检测结果。系统测试与优化:评估模型的准确性、实时性,并对系统进行优化。

YOLO 882

_T 未定义错误

当编译时出现"_T"未定义错误时,在头文件中添加引用tchar.h头文件即可。 #include

sdhongjun的专栏 1万+

YOLOV5 自动刷图脚本实战(十五)之如何找到正确的门

DXF是一个2D游戏,我们所看到的人物移动,其实是后面的背景在移动,我们所看到的画面,不过是一个完整背景中的一个镜头视角而已想要正确找到门的坐标,我们需要对不同的地图中的每个房间做一些配置信息。

qq_38892949的博客 2805

HINT: High-quality INpainting Transformer with Mask-Aware Encoding and Enhanced Attention 训练自己的数据集

HINT(高质量图像修复变换器)通过创新的掩码感知像素洗牌下采样模块(MPD)和空间激活通道注意力层(SCAL),显著提高了图像修复的质量,尤其在大面积缺失区域的情况下。实验表明,HINT在CelebA、CelebA-HQ、Places2和敦煌数据集上超越了现有的最先进模型,提升了图像的细节和结构一致性。

LJ1147517021的博客 312

VC6和VS2003 转换到VS2005 时可能会遇到的问题以及解决方法

经常写VC工程的人都会遇到升级到VS2005时出现的各种各样的问题,下面写一些自己遇到的问题,还有什么不全的请大家补充。希望能给朋友们一些帮助。1.以前可以这样用try catchcatch(CException *e){       pApp->Warn("%s",e->GetErrorMessage);       e->Delete();       return FALSE

蒋黎科的专栏 2430

搞定ESD(五):静电放电问题分析与调试

前面深入分析了静电放电的干扰机理、耦合路径,从现在开始将进入下一个大家非常关注的环节:静电放电问题分析与调试,掌握静电放电问题的分析方法,快速锁定敏感设备或者耦合路径,可以达到事半功倍的效果。

记得诚 2793

error c3861 :"_T":找不到标识符

原文地址: http://hi.baidu.com/%CB%B9%B7%D2%BF%CB%CB%B986/blog/item/cfd9613b4dae24e115cecb0e.html 添加 #include 即可

friendan的专栏 2万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

stren 和sizeof的区别

1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。 该类型保证能容纳实现所建立的最大对象的字节大小。  。  2.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。 3 strlen是函数,sizeof是算符 sizeof还可以用函数做参数,比如:  int  f();

luntaiqinghua的博客 963

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

把项目从VS2005升级到VS2013

小斯同学花了几周的时间,终于把我们的服务端和客户端从vs2005升级到vs2013了。真是不得不给个赞。升级的过程中遇到了各种问题,小斯同学跋山涉水、越过艰难险阻终于成功让我们用上了高大上的宇宙第一IDE——vs2013。所以这里我顺带把他升级中遇到的问题记录一下,也许对一些朋友是种参考。首先,需要说明一下,之前在csdn上看到有人提了一个问题:为什么好多游戏都用VS2005...

weixin_34007291的博客 373

c++编译错误error C3861: “xxxx”: 找不到标识符

错误描述 在导入自定义的头文件时,报C3861 “_ReturnAddress”: 找不到标识符错误,错误信息如下 解决办法 在自定义的头文件前面导入,指向的头文件即可 include ""//自定义头文件 include <ppltasks.h&gt; 参考:https://zhuanlan.zhihu.com/p/26600794 ...

修炼之路 1万+

error C3861,找不到标识符

今天在编写C++时,明明写了jStr2Str方法,在生成的过程中,出现错误: 这个方法的生命和实现就在调用的下面: 出现这种错误由于这个cpp并没有面向对象的编译,所以是“顺序编译” ,因此要将这个方法放到调用的前面:

Study_lizi的博客 6390

关于error C3861: “xxxx”: 找不到标识符的处理方法

关于C++ error C3861: “xxxx”: 找不到标识符的处理方法 看上去这个问题可能很复杂,但是有的时候初学者就是这么小白,解决的方法是:需要调用的函数或者方法放在调用的函数或者方法之前就行了。因为你调用的函数是需要提前申明的。 ...

qq_42158680的博客 3500

如何解决VC2019中:error C3861: “xxxx”: 找不到标识符

如何解决VC2019中:error C3861: “xxxx”找不到标识符问题 问题原因: 因为C程序中代码是顺序编译的,不管是常量、变量,还是函数,都是先定义后使用的,不能先定义,再使用。如果存在多个函数互相调用,那么编译的时候,就会出现这个错。我举个简单的例子: int i=10,j=10; z=i+j; int z=0; 这样编译就会出错,因为编译到z=i+j;这里的时候,编译器找不到你...

Lionxiaorw的博客 2万+

c语言为什么找不到标识符,c语言问题~error C3861: “find”: 找不到标识符

满意答案jinzhe4112013.04.18采纳率:40%等级:12已帮助:9514人函数要先声明后使用!!!#include#include#define format "%s\n%s\n%d\n%d\n"//函数功能:输入3个工人的姓名,部门,工资以及税金;然后输入一个名字来找他的信息,并输出;struct salary{char name[20];char department [...

weixin_33158453的博客 2521

error C3861: “_T”: 找不到标识符

添加头文件 #include 即可

JUST_DO_1122的博客 7772
上一篇: VC中创建不可改变大小的窗口,及其限制窗口大小的办法
下一篇: 如何实现鼠标拖放文件
ShenRui
博客等级 码龄20年 63粉丝 36原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值