zoukankan      html  css  js  c++  java
  • 程序移植

    一、VS2010与VC++编译器的区别:
    1.VS2010并不是针对C++的,C++只是它的一小部分,它更加关注.net平台程序开发(主要是C#、VB,C++/CLI(C++在.net下的语言)),而VC++6.0是专注与C++开发,或者说VC6只能开发C++程序,在VC6.0时期还没有.net

    2.vc6对最新的C++的标准完全不支持,STL的支持也有缺陷,更加不支持可变参数宏,vc2010能够支持部分C++的特性,完全支持STL,同时支持可变参数宏

    3.vs2010添加很多微软.NET的新特性,支持更多种类的资源文件,帮助文档也非常丰富,相较于vc6更加适合开发软件产品。vc6里面对COM的使用和后面的vc版本都有一些区别,这些可能导致以后在工作中遇到麻烦。另外,vc6对win7及其之后的版本支持并不好,很容易发生不兼容的情况。

    4.默认编码不同,VC6默认是ansi,文件小速度慢。VS2010默认是unicode,文件大速度快。后者错误好找不用编译就出来了,bug少,更先进更强大,vc6有bug,但是编译快,文件相对较小

    5.vs2010开发出来的程序可以自动根据特定的CPU翻译成高效的目标代码,VC6开发出来的程序,要想换成其它的CPU必须要重新开发

    6.VC6的界面老旧,操作复杂,不完全符合C++的安全标准,但是是底层语言,与操作系统良好结合,使用广泛;VS2010可视化界面,安全可靠,支持C++标准,部署简

    7.VS2010自带了winsock2库(第2版的库),每次都不用加Ws2_32.lib、MSDN online

    移植的问题:
    1.高级的编译器,在同一个基础下开发后,由于向前兼容,可以打开原始编译的工作平台

    2.环境变量与宏设置
    _WIN32_WINNT 与_WIN32_IE 设置冲突
    设定的windows平台版本,与安装配置的ADK不相符合
    #if _MSC_VER <= 1200 // MFC 6.0 or earlier

    3.MFC出现的时候STL还没有成为C++的标准,所以MFC使用一套自己的模版库,比如CArray、CList、CMap等等,这些类型声明都在afximpl.h文件中。

    4.为了显著增加CRT库的安全性,许多CRT函数都有了一个更安全的新版本,新版本和旧版本的区别就是新版本函数名多了一个_s后缀。鼓励使用安全切最新的版本,但是参数等变化很大,调整需要很多时间。
    可以使用#pragma warning( disable : 4996 )预处理指令解除警告

    5.新旧版本的MFC以及界面控件?中对ON_MESSAGE消息映射宏定义不同
    旧版:
    #define ON_MESSAGE(message, memberFxn) /
    { message, 0, 0, 0, AfxSig_lwl, /
    (AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM,
    LPARAM))&memberFxn },
    新版:
    #define ON_MESSAGE(message, memberFxn) /
    { message, 0, 0, 0, AfxSig_lwl, /
    (AFX_PMSG)(AFX_PMSGW) /
    (static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > /
    (memberFxn)) },

    新的ON_MESSAGE宏使用C++的?static_cast?操作符代替了C类型的强制转换。

    用户没有按照ON_MESSAGE宏的约定声明来定义消息响应函数,就会造成错误
    旧版:
    #define?ON_WM_NCHITTEST()?/?
    {?WM_NCHITTEST,?0,?0,?0,?AfxSig_wp,?/?
    (AFX_PMSG)(AFX_PMSGW)(UINT(AFX_MSG_CALL?CWnd::*)(CPoint))&OnNcHitTest?},?
    新版:
    #define ON_WM_NCHITTEST() /
    { WM_NCHITTEST, 0, 0, 0, AfxSig_l_p, /
    (AFX_PMSG)(AFX_PMSGW) /
    (static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(CPoint) > (&ThisClass ::
    OnNcHitTest)) },

    返回值类型由UINT改成了LRESULT,再加上static_cast的严格检查而出错

    6.新的C++编译器不再支持默认类型的变量定义

    7.for 语句的变量作用域问题

    8.strchr(_tcschr)、strpbrk(_tcspbrk ??)、strrchr(_tcsrchr)和strstr(_tcsstr)这四个函数在VC6的CRT库中定义的返回值都是char *(TCHAR *),所以以前的代码通常是这样使用的:TCHAR *cp = _tcschr( pszPath, _T('//') ); //使用*cp,可以通过cp指针修改pszPath的内容这其实是一个“漏洞”,因为如果pszPath是const char(TCHAR) *字符串,那么就表示它不希望修改字符串的内容,但是调用strchr(_tcschr函数后就可以通过cp指针修改其内容了,这岂不荒谬?所有在新版本的CRT库中,这几个函数的返回值都改成const char *。

    9.wchar_t *类型与USHORT *的转换错误

  • 相关阅读:
    .NET 正则表达式使用高级技巧之替换类介绍
    道法术器势
    JS函数匿名替换
    批量更改数据库表架构(生成sql后直接执行!)
    转: 从现实生活中理解什么是广播机制
    public View getView(int position, View convertView, final ViewGroup parent)三个参数的意思
    Android Intent个人介绍
    WPF中Timer与DispatcherTimer类的区别
    C# 使用ManualResetEvent 进行线程同步
    C# 使用AutoResetEvent进行线程同步
  • 原文地址:https://www.cnblogs.com/joeat1/p/11145949.html
Copyright © 2011-2022 走看看