青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

移置c++從6.0到2005

our months ago, Microsoft publicized a list of features that could cause existing Visual C++ apps to break when migrated to Visual Studio 2005. Many of these features are core C++ updates that are meant to bring Visual C++ to full compliance with ISO C++. There's no doubt that these changes are a major improvement over the non-compliant hacks that have been in use since the mid-1990s. The downside is that migrating to Visual Studio 2005 requires a thorough code review—and possibly some repairs. The following sections show some of the code changes required for porting existing C++ apps to Visual Studio 2005.


Your Visual C++ 6.0 apps will not compile when migrated to Visual Studio 2005 unless you fix them. How do you go about it?


Use this check list to locate incompliant code spots and repair them according the following guidelines.

Code Review and Analysis
Earlier versions of Visual C++ literally forced you to write non-compliant C++ code. Therefore, it's unlikely that an existing Visual 6.0 app will compile as-is with Visual C++ 8.0 (the C++ compiler of Visual Studio 2005). Therefore, your first step is to review the code and locate potential problems. Before you make any changes to the code, my advice is to review the entire code base and systematically mark all code sections that might be incompatible with Visual Studio 2005. Only then should you make the necessary repairs. It's better to repair incompliant code in several passes, each dealing with a different category of fixes. For example, your first pass may focus on for-loops, the next pass on exception handling, and so on. There are three reasons for splitting the code repairs to separate sessions:
  • Team Work: Developers specializing in different categories can work on the same code simultaneously.
  • Coding Standards: It's easier to enforce a uniform coding standard when focusing on one feature at a time.
  • Keyword-based Lookup: Each category is typically associated with a specific C++ keyword (e.g., to locate all for-loops, search for the keyword for).
    Code Review and Analysis
    Earlier versions of Visual C++ literally forced you to write non-compliant C++ code. Therefore, it's unlikely that an existing Visual 6.0 app will compile as-is with Visual C++ 8.0 (the C++ compiler of Visual Studio 2005). Therefore, your first step is to review the code and locate potential problems. Before you make any changes to the code, my advice is to review the entire code base and systematically mark all code sections that might be incompatible with Visual Studio 2005. Only then should you make the necessary repairs. It's better to repair incompliant code in several passes, each dealing with a different category of fixes. For example, your first pass may focus on for-loops, the next pass on exception handling, and so on. There are three reasons for splitting the code repairs to separate sessions:
    • Team Work: Developers specializing in different categories can work on the same code simultaneously.
    • Coding Standards: It's easier to enforce a uniform coding standard when focusing on one feature at a time.
    • Keyword-based Lookup: Each category is typically associated with a specific C++ keyword (e.g., to locate all for-loops, search for the keyword for).

Code Fixing
Some of the necessary code fixes are rather straightforward. These include for-loops, pointers to member functions, the deprecated "default to int" rule, and exception handling. Let's see what these all mean.

  • for-loops: In pre-standard C++, variables declared in a for-loop were visible from the loop's enclosing scope. This behavior is still maintained in Visual C++ 6.0:
    
    for (int i=0; i<MAX; i++)
    {
      //..do something
    }
    
    int j=i; //allowed in VC++ 6.0
    
    However, in Visual Studio 2005, the scope of i is restricted to the for-loop. If you want to refer to this variable from the enclosing scope, move its declaration outside the for-loop:
    
    int i=0;
    for (; i<MAX; i++)
    {
      //..do something
    }
    int j=i; //OK
    

    Figure 1. Exception Handling: This image shows how to override the default exception handling command line flag.

  • Declarations of pointers to members: In pre-standard C++, it was possible to take the address of a member function without using the & operator:
    
    struct S
    {
     void func();
    };
    
    void (S::*pmf)() = S::func; //allowed in VC++ 6.0
    
    In Visual Studio 2005, the & is mandatory:
    
    void (S::*pmf)() = &S::func; //OK
    
    Tip: To locate problematic code, search for the tokens ::* and ::.
  • "default to int": Pre-standard C++ (and all C variants predating C99), use the "default to int" rule when declarations of functions and variables do not contain an explicit datatype. This behavior is maintained in Visual C++ 6.0 as the following declarations show:
    
    const x=0; //implicit int
    static num; // implicit int
    myfunc(void *ptr); //implicit return type int
    
    In Visual Studio 2005, you have to specify the datatype explicitly:
    
    const int x=0; 
    static int num; 
    int myfunc(void *ptr);  
    
    Tip: To locate incompliant code of this category, compile your app with Visual Studio 2005 and look for compilation errors about a missing datatype in a declaration.

  • Exception Handling: Older versions of Visual C++ happily mixed standard C++ exceptions with the asynchronous Structured Exception Handling (SEH). Consequently, a catch(...) block might catch not just a C++ exception created by a throw statement, but also an asynchronous SEH e.g., access violation. Not only is this behavior incompliant, it makes debugging more difficult. Visual Studio 2005 fixes this loophole. It's now possible to specify whether a catch(...) handler should catch only C++ exceptions by using the default /EHsc flag (this is the recommended option), or maintain the non-standard behavior of Visual C++ 6.0 by using the /EHa flag (see Figure 1).

Author's Note: The fixes shown here don't reflect all of the changes in Visual Studio 2005. For a complete list, consult Visual Studio 2005 homepage. Also, I have focused on core C++ features. Other Visual C++-specific changes such as multithreaded CRTs, deprecated APIs etc., aren't discussed here.

Code Fixing
Some of the necessary code fixes are rather straightforward. These include for-loops, pointers to member functions, the deprecated "default to int" rule, and exception handling. Let's see what these all mean.
  • for-loops: In pre-standard C++, variables declared in a for-loop were visible from the loop's enclosing scope. This behavior is still maintained in Visual C++ 6.0:
    
    for (int i=0; i<MAX; i++)
    {
      //..do something
    }
    
    int j=i; //allowed in VC++ 6.0
    
    However, in Visual Studio 2005, the scope of i is restricted to the for-loop. If you want to refer to this variable from the enclosing scope, move its declaration outside the for-loop:
    
    int i=0;
    for (; i<MAX; i++)
    {
      //..do something
    }
    int j=i; //OK
    

    Figure 1. Exception Handling: This image shows how to override the default exception handling command line flag.

  • Declarations of pointers to members: In pre-standard C++, it was possible to take the address of a member function without using the & operator:
    
    struct S
    {
     void func();
    };
    
    void (S::*pmf)() = S::func; //allowed in VC++ 6.0
    
    In Visual Studio 2005, the & is mandatory:
    
    void (S::*pmf)() = &S::func; //OK
    
    Tip: To locate problematic code, search for the tokens ::* and ::.
  • "default to int": Pre-standard C++ (and all C variants predating C99), use the "default to int" rule when declarations of functions and variables do not contain an explicit datatype. This behavior is maintained in Visual C++ 6.0 as the following declarations show:
    
    const x=0; //implicit int
    static num; // implicit int
    myfunc(void *ptr); //implicit return type int
    
    In Visual Studio 2005, you have to specify the datatype explicitly:
    
    const int x=0; 
    static int num; 
    int myfunc(void *ptr);  
    
    Tip: To locate incompliant code of this category, compile your app with Visual Studio 2005 and look for compilation errors about a missing datatype in a declaration.

  • Exception Handling: Older versions of Visual C++ happily mixed standard C++ exceptions with the asynchronous Structured Exception Handling (SEH). Consequently, a catch(...) block might catch not just a C++ exception created by a throw statement, but also an asynchronous SEH e.g., access violation. Not only is this behavior incompliant, it makes debugging more difficult. Visual Studio 2005 fixes this loophole. It's now possible to specify whether a catch(...) handler should catch only C++ exceptions by using the default /EHsc flag (this is the recommended option), or maintain the non-standard behavior of Visual C++ 6.0 by using the /EHa flag (see Figure 1).
Author's Note: The fixes shown here don't reflect all of the changes in Visual Studio 2005. For a complete list, consult Visual Studio 2005 homepage. Also, I have focused on core C++ features. Other Visual C++-specific changes such as multithreaded CRTs, deprecated APIs etc., aren't discussed here.
Just in the Nick of Time
Visual Studio 2005 and Visual C++ 6.0 have different Application Binary Interfaces, or ABIs. This means that the same datatype or function may have different binary layouts and mangled names. The different ABIs affect among other things the std::time_t and wchar_t datatypes.

Visual C++ 6.0 treats std::time_t as a 32-bit integer, whereas in Visual Studio 2005 this type is a 64-bit integer. This change might necessitate code updates if your app assumes a 32-bit time_t e.g., hard-coded buffer sizes and format flags (further information on migrating to 64-bit code is available here). Another ABI change affects the representation of the wchar_t type. Up until now, wchar_t has been a typedef synonymous with unsigned short. However, Visual Studio 2005 treats wchar_t as a built-in type. This change might affect the overload resolution of functions:


int _wtolowers(unsigned short *ws);
wchar_t ws[10] = L"Test";
_wtolowers(ws); 
This code compiles with Visual Studio 6.0 but it will break with Visual Studio 2005 because wchar_t * is incompatible with unsigned short *.

All and Sundry
The changes described here affect not just Visual C++ 6.0 code ported to Visual Studio 2005. Rather, they apply to legacy C++ code ported to an ISO compliant C++ compiler in general. The fear from these changes has led many project managers to defer upgrades at all costs. This policy isn't justified, though. Almost without exception, these changes are only for the best.

Danny Kalev is a certified system analyst and software engineer specializing in C++ and the theoretical aspects of formal languages. He is the author of Informit C++ Reference Guide and The ANSI/ISO Professional C++ Programmer's Handbook. He was a member of the C++ standards committee between 1997 and 2000. Danny recently finished his MA in general linguistics summa cum laude. In his spare time he likes to listen to classical music, read Victorian literature, and explore natural languages such as Hittite, Basque, and Irish Gaelic. Additional interests include archeology and geology. He also gives lectures about programming languages and applied linguistics at academic institutes.


引自:http://www.devx.com/cplus/10MinuteSolution/28908/0/page/1


-------------------------------------------------------------------------------------------------------------------

VC6==>VS2005的一些問題

我接收到一個任務,是把公司的一個產(chǎn)品從vc6遷移到vs2005,結果發(fā)現(xiàn)了很多的warning和error

warning 主要是使用了strcpy,strcat這樣的函數(shù)
這些在2005中都是unsafe_api.
在vs2005都推薦使用strcpy_s,strcat_s.
我想微軟這么做固然跟C++ standard有偏差
但是這些函數(shù)的使用確實造成了微軟產(chǎn)品經(jīng)常有的漏洞
微軟深受這些函數(shù)的危害阿
所以在vs2005這些都是warning

error的類型主要是以下幾種,多半和STL有關

1.include 帶.h的舊式頭文件,比如 #include <iostream.h>改為include <iostream>

2.vc6的string iterator的 char *,而vs2005中卻不是
strcpy(s.begin(), str);是不能compile的,應改為strcpy((char *) s.c_str(),str);

3.函數(shù)返回類型不支持缺省是int
missing type specifier - int assumed. Note: C++ does not support default-int
<Code>
    extern IsWindowsNT();

<Fix>
    extern int IsWindowsNT();

posted on 2005-12-20 08:56 夢在天涯 閱讀(2090) 評論(1)  編輯 收藏 引用 所屬分類: CPlusPlus

評論

# re: 移置c++從6.0到2005 2010-02-09 16:25 wantukang

不錯,先記下,以后有需要再來查看  回復  更多評論   

公告

EMail:itech001#126.com

導航

統(tǒng)計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1815010
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              99re6这里只有精品视频在线观看| 久久精品国产免费观看| 麻豆精品网站| 久久综合九色综合欧美就去吻 | 久久久精品国产免大香伊| 亚洲伊人观看| 亚洲欧美日韩精品久久| 午夜精品成人在线| 久久久成人网| 欧美91视频| 欧美日韩一二三区| 国产精品亚洲欧美| 韩国视频理论视频久久| 亚洲观看高清完整版在线观看| 欧美日韩亚洲视频一区| 99精品视频免费| 亚洲激情亚洲| 亚洲国产精品小视频| 亚洲经典自拍| 亚洲婷婷在线| 久久精品女人的天堂av| 欧美mv日韩mv国产网站| 欧美日韩国产经典色站一区二区三区| 欧美午夜国产| 伊人成人在线视频| 亚洲毛片在线免费观看| 亚洲欧美日韩在线观看a三区| 久久精品一区二区三区中文字幕 | 看片网站欧美日韩| 亚洲欧洲日产国产网站| 亚洲自拍偷拍视频| 久久综合电影| 国产精品视频1区| 亚洲激情精品| 久久不见久久见免费视频1| 欧美福利在线| 欧美一级理论片| 欧美日韩激情小视频| 国产主播一区| 亚洲一区二区av电影| 麻豆成人91精品二区三区| 日韩一级欧洲| 欧美承认网站| 一区二区在线观看视频| 亚洲欧美乱综合| 亚洲国产高清一区| 久久精品最新地址| 国产女人精品视频| 一区二区三区成人精品| 欧美凹凸一区二区三区视频| 亚洲一区黄色| 欧美日韩一二三区| 亚洲国产精品成人久久综合一区| 亚洲欧美中文日韩v在线观看| 欧美激情精品久久久久久大尺度| 亚洲免费婷婷| 欧美无砖砖区免费| 99精品欧美一区| 欧美激情一区二区三区蜜桃视频| 欧美一区二区三区在| 国产精品色婷婷| 亚洲视频网在线直播| 亚洲国产欧美国产综合一区| 久久视频在线看| 精品白丝av| 久久九九国产精品怡红院| 亚洲男人的天堂在线| 国产精品久久久久久久9999| 亚洲一区二区在线视频 | 欧美福利一区二区| 久久久噜噜噜久久| 国产亚洲精品高潮| 欧美在线国产| 亚洲欧美日本伦理| 国产欧美欧洲在线观看| 欧美伊人精品成人久久综合97| 一二美女精品欧洲| 欧美四级伦理在线| 亚洲视频专区在线| 中文一区在线| 国产精品视频不卡| 欧美亚洲一区二区在线观看| 亚洲午夜视频在线观看| 国产日本亚洲高清| 免费看成人av| 欧美国产日韩a欧美在线观看| 亚洲精品欧美日韩专区| 亚洲乱码国产乱码精品精98午夜| 欧美日韩一区二区在线观看视频 | 日韩亚洲精品在线| 亚洲精品日韩在线观看| 欧美无乱码久久久免费午夜一区| 亚洲欧美电影院| 性欧美8khd高清极品| 尤物精品国产第一福利三区| 亚洲黄色在线| 国产精品理论片| 久久一本综合频道| 免费在线国产精品| 亚洲欧美国产一区二区三区| 欧美一区二区三区成人| 欧美午夜电影网| 久久综合色播五月| 欧美视频一区二区三区| 久久性色av| 欧美日韩专区在线| 蜜臀av性久久久久蜜臀aⅴ| 欧美日韩亚洲免费| 久久久久综合网| 欧美日韩国产综合网| 久久久久国产精品午夜一区| 欧美黄色日本| 久久这里只有| 国产精品入口66mio| 亚洲国产另类久久久精品极度| 国产精品专区h在线观看| 亚洲国产免费| 国内精品伊人久久久久av影院| 亚洲日本国产| 在线观看视频免费一区二区三区| 99精品久久久| 亚洲人精品午夜在线观看| 亚洲综合色在线| 亚洲网站在线看| 欧美国产精品久久| 老司机免费视频一区二区| 国产精品美女999| 亚洲精品网站在线播放gif| 黄色精品网站| 亚洲一区二区三区久久| 免费在线亚洲欧美| 国产人成精品一区二区三| 亚洲精品视频一区| 亚洲国产小视频在线观看| 亚洲欧美视频| 欧美一区二区三区免费观看 | 久久精品网址| 欧美在线在线| 国产人成一区二区三区影院| 日韩视频亚洲视频| 亚洲精选一区| 欧美高清视频免费观看| 美女图片一区二区| 国产在线观看精品一区二区三区| 亚洲综合久久久久| 欧美一区二区三区在线观看视频| 欧美日韩在线精品一区二区三区| 91久久综合| 日韩视频精品在线观看| 久久9热精品视频| 久久综合九色99| 一区精品在线| 蜜桃久久精品乱码一区二区| 欧美大片va欧美在线播放| 亚洲国产精品ⅴa在线观看| 麻豆成人av| 最新亚洲激情| 亚洲淫性视频| 国产一区91| 久久综合国产精品台湾中文娱乐网| 老牛国产精品一区的观看方式| 久久激情视频免费观看| 久久综合一区二区三区| 亚洲国产精品电影| 欧美激情性爽国产精品17p| 亚洲国产精品第一区二区三区| 亚洲日韩第九十九页| 欧美日韩成人| 香蕉av777xxx色综合一区| 久久久视频精品| 最近看过的日韩成人| 欧美日韩成人免费| 亚洲综合精品四区| 男人天堂欧美日韩| 亚洲欧美日韩在线不卡| 国产主播精品在线| 欧美日韩国产综合在线| 久久久精品国产一区二区三区| 亚洲三级网站| 久久久亚洲午夜电影| 亚洲一区二区三区在线视频| 精品av久久707| 国产精品美女主播在线观看纯欲| 久久久久国产精品午夜一区| 99在线|亚洲一区二区| 蜜臀av性久久久久蜜臀aⅴ| 亚洲一区成人| 日韩一级精品| 亚洲电影免费观看高清完整版在线 | 欧美精品一区二区三区久久久竹菊 | 亚洲精品视频啊美女在线直播| 亚洲欧洲精品成人久久奇米网| 久久国产天堂福利天堂| 91久久久久久久久| 国产精品一区久久久| 女女同性精品视频| 亚洲主播在线观看| 玖玖精品视频| 国产精品久久久久久久7电影| 久久婷婷国产麻豆91天堂|