对于VS2003编译器的BUG给予细致分析
创始人
2024-06-13 00:03:24
0次

最新的VS2003编译器,是一个很通用的数据库管理程序,到目前为止所有的代码都是通过Visual Studio编写,核心部分的设计基本完成,但愿可以通过.NET开发一些小的模块,Visual Studio的程序员真的没有多少精英啊。我们必须要用VS2003编译器下的C++代码升级到VS2005编译器下,从而可以充分利用.NET与C++混合编程。

升级的基本过程如下:

1、首先备份现有的VC程序,备份之后启动VS2005。

2、通过VS2005打开要升级的解决方案,系统提示自动转换,如果VC程序已经被嵌入到VSS中,则系统将提示登录VSS,并且自动将解决方案文件和项目文件签出。(注意选择备份原来版本 的解决方案的选项。)

3、一般情况下系统提示成功,可能会有两个警告,可以不予理会。因为升级过程中仅仅修改了解决方案文件和工程项目文件,所以速度会很快,C++头文件和CPP文件都不作任何修改(这和VB6到VB2005的升级不同),因此速度很快。#t#

4、在VS2005中重新编译升级后的程序,很可能出现很多警告和错误提示,警告可以不予理会,错误提示必须修改。我所遇到的错误提示主要有两种:一种提示是“某个变量没有定义”,另外一种是模板类的消息映射的错误提示。

先说第一种错误提示,例如如下的两个for循环语句

  1. for(int i=0;i<10;i++)  
  2. {  
  3. }  
  4. for(i=0;i<100;i++)//  

上面的语句在VS2003中没有问题,在2005中则是错误的,2005将i作为第一个for循环中的局部变量处理,因此编译器认为第二个for循环中的i没有定义。这类错误可能有很多,但是修改起来比较容易。

第二种错误是模板类的消息映射宏错误。我在程序中设计了一个控件模板:

  1. #define UNI_FORMVIEW_CONTROLS(P) \  
  2. typedef CUniDataCtrl,P> MEDICONEXPORT CUniEdit; \  
  3. typedef CUniDataCtrl,P> MEDICONEXPORT CUniAddress; \  
  4. typedef CUniDataCtrl,P> MEDICONEXPORT  CUniComboBox; \  
  5. UNI_FORMVIEW_CONTROLS(CMdcLayerPanel)  

并通过typedef定义了很多VS2003编译器类型(20多个)

  1. #define Map(T,B) \  
  2. BEGIN_MESSAGE_MAP(T, B)\  
  3. ON_WM_LBUTTONDOWN()\  
  4. ON_WM_RBUTTONDOWN()\  
  5. ON_WM_MOUSEMOVE()\  
  6. ON_WM_SETCURSOR()\  
  7. ON_WM_SETFOCUS()\  
  8. ON_WM_KILLFOCUS()\  
  9. ON_REGISTERED_MESSAGE(BCGM_PROPERTY_CHANGED,OnPropertyChange)\  
  10. END_MESSAGE_MAP()  
  11. #define MSG_MAP_UNI_EDIT Map(CUniEdit,CEdit)   
  12. #define MSG_MAP_UNI_ADDRESS Map(CUniAddress,CEditAddress)   
  13. #define MSG_MAP_UNI_COMBOBOX Map(CUniComboBox,CComboBoxData)   
  14. #define MSG_MAP_UNI_DATETIMECTRL Map(CUniDateTimeCtrl,CMyDateTimeCtrl)   
  15. #define MSG_MAP_UNI_CHECKCOMBOBOX Map(CUniCheckComboBox,CCheckComboBox)   
  16. #define MSG_MAP_UNI_ALL \  
  17. MSG_MAP_UNI_EDIT \  
  18. MSG_MAP_UNI_ADDRESS \  
  19. MSG_MAP_UNI_COMBOBOX \  
  20. MSG_MAP_UNI_DATETIMECTRL \  
  21. MSG_MAP_UNI_CHECKCOMBOBOX \  

最后,我在一个CPP文件中直接调用 MSG_MAP_UNI_ALL 既完成了宏的消息映射的定义。但是这种方式在VS2005中无法编译通过,最后我不得不在模板类的头文件中增加了如下的一个消息映射宏:

  1. #define BEGIN_TEMPLATE_MESSAGE_MAP_EX(theClass, 
    type_name1,type_name2,  baseClass)  
  2. PTM_WARNING_DISABLE  
  3. template < typename type_name1,typename type_name2 > 
  4. const AFX_MSGMAP* theClass< type_name1 ,type_name2 >
    GetMessageMap() const  
  5. {  
  6. return GetThisMessageMap();   
  7. }  
  8. template < typename type_name1 ,typename type_name2> 
  9. const AFX_MSGMAP* PASCAL theClass
    < type_name1 ,type_name2  >GetThisMessageMap()  
  10. {  
  11. typedef theClass< type_name1 ,type_name2  > ThisClass;  
  12. typedef baseClass TheBaseClass; 

上述的模板类消息映射宏我是参考BEGIN_TEMPLATE_MESSAGE_MAP(theClass, type_name, baseClass)编写的,该宏只支持一个模板参数,而我定义的模板中需要两个模板参数,因此,我自己扩充VS2003编译器一下。关于BEGIN_TEMPLATE_MESSAGE_MAP的帮助在MSDN中好像没有,在afxwin.h中定义了:

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
只需三步,让你掌握阿尔法路由器... 请参照以下阿尔法路由器设置方法,通过浏览器进入及设置宽带路由器。经过这三个步骤的设置,基本上能够熟悉...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何更省钱? 近期特价热门硒鼓... 如今激光打印设备已经成为商务或企业的绝对主力办公设备,但采购者往往忽视了激光打印设备所用的耗材,相对...