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

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的一些問題

我接收到一個任務,是把公司的一個產品從vc6遷移到vs2005,結果發現了很多的warning和error

warning 主要是使用了strcpy,strcat這樣的函數
這些在2005中都是unsafe_api.
在vs2005都推薦使用strcpy_s,strcat_s.
我想微軟這么做固然跟C++ standard有偏差
但是這些函數的使用確實造成了微軟產品經常有的漏洞
微軟深受這些函數的危害阿
所以在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.函數返回類型不支持缺省是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 夢在天涯 閱讀(2081) 評論(1)  編輯 收藏 引用 所屬分類: CPlusPlus

評論

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

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

公告

EMail:itech001#126.com

導航

統計

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

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1811726
  • 排名 - 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>
              香蕉精品999视频一区二区| 久久精品人人做人人综合| 亚洲午夜视频在线| 亚洲理论在线| av成人老司机| aa国产精品| 亚洲四色影视在线观看| 中文在线不卡| 亚洲欧美日本精品| 久久精品一区| 免费亚洲电影在线观看| 亚洲承认在线| 欧美成人中文字幕| 亚洲激情女人| 午夜精品福利视频| 久久人91精品久久久久久不卡| 久久国产精品色婷婷| 欧美jizz19hd性欧美| 欧美欧美在线| 国产伦一区二区三区色一情| 欧美国产在线观看| 亚洲黄色av| 一片黄亚洲嫩模| 久久黄色级2电影| 欧美成人免费在线视频| 亚洲精品免费网站| 欧美一区视频| 欧美成人自拍| 国产午夜精品视频| 亚洲国内欧美| 欧美在线视频全部完| 欧美黄色一区二区| 亚洲一卡二卡三卡四卡五卡| 亚洲欧美日本日韩| 欧美风情在线| 国产一区二三区| 亚洲综合不卡| 亚洲欧洲日本在线| 久久久久久久综合狠狠综合| 欧美视频一区二区在线观看| 亚洲国产婷婷| 久久久久中文| 亚洲伊人一本大道中文字幕| 欧美成人性生活| 精品动漫av| 欧美亚洲免费电影| 亚洲国产欧美日韩精品| 久久成人国产| 国产丝袜一区二区三区| 亚洲深爱激情| 亚洲精品视频一区二区三区| 久久精品视频网| 国产亚洲欧美日韩美女| 一区二区三区四区精品| 欧美成人免费视频| 欧美一区二区视频在线观看2020| 欧美视频一区二区| 亚洲天天影视| 亚洲精品影视| 欧美麻豆久久久久久中文| 亚洲福利视频网| 欧美成黄导航| 嫩模写真一区二区三区三州| 伊人伊人伊人久久| 久久综合给合| 久久精品二区| 在线观看av不卡| 乱码第一页成人| 久久国产一区二区| 伊人春色精品| 欧美成人免费va影院高清| 久久精品国产一区二区三区免费看| 国产一区二区三区免费在线观看| 欧美一区二区视频97| 亚洲欧美精品在线观看| 国产综合久久久久影院| 久久久噜噜噜久久中文字幕色伊伊| 午夜精品一区二区三区在线视 | 欧美韩国一区| 久久久成人网| 亚洲国产成人在线视频| 亚洲丶国产丶欧美一区二区三区| 久久精品国产欧美激情| 亚洲激情在线| 99国产精品99久久久久久| 国产精品美女在线观看| 久久久久久久久久码影片| 久久午夜羞羞影院免费观看| 亚洲国产婷婷香蕉久久久久久99| 亚洲国产欧美在线| 国产精品二区二区三区| 久久午夜视频| 欧美日韩免费区域视频在线观看| 欧美一区二区成人| 免费在线观看精品| 午夜精品美女自拍福到在线| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲美女色禁图| 欧美一级黄色网| 99riav国产精品| 欧美在线日韩| 亚洲线精品一区二区三区八戒| 香蕉久久精品日日躁夜夜躁| 亚洲国产精品一区二区久| 在线一区免费观看| 亚洲国产欧美不卡在线观看 | 久久视频在线免费观看| 中文一区字幕| 老妇喷水一区二区三区| 亚洲欧美国产高清| 久久夜色撩人精品| 久久精品国产亚洲一区二区| 欧美好骚综合网| 久久久久一区二区三区四区| 欧美久久九九| 欧美激情乱人伦| 国语自产在线不卡| 亚洲一区国产一区| 99亚洲伊人久久精品影院红桃| 欧美在线一级va免费观看| 一区二区久久| 理论片一区二区在线| 久久久精品一区| 国产农村妇女精品| 99精品国产福利在线观看免费 | 亚洲国产三级| 久久久噜噜噜久久久| 亚洲专区一区| 欧美特黄一级| 99国产精品一区| 99日韩精品| 亚洲综合大片69999| 亚洲精品乱码久久久久久日本蜜臀| 欧美亚洲视频在线观看| 亚洲欧美激情诱惑| 国产精品日韩一区二区三区| 亚洲午夜精品福利| 亚洲天堂男人| 亚洲欧美国产另类| 国产精品扒开腿爽爽爽视频| 亚洲精品日韩在线观看| 亚洲三级色网| 欧美福利一区二区| 欧美大片在线看免费观看| 亚洲第一网站免费视频| 久久久午夜电影| 欧美不卡一区| 亚洲精品三级| 欧美日韩成人| 亚洲一二三区在线观看| 久久精品国产精品亚洲综合 | 99re6热只有精品免费观看| 欧美激情 亚洲a∨综合| 亚洲美女精品成人在线视频| 亚洲夜间福利| 国产一区二区主播在线| 老司机一区二区| 亚洲激情成人在线| 亚洲欧美一区二区三区在线| 国产欧美日韩一区二区三区在线观看| 欧美一区二区在线播放| 欧美国产综合一区二区| 亚洲制服少妇| 伊人婷婷欧美激情| 欧美日韩亚洲国产精品| 性亚洲最疯狂xxxx高清| 亚洲第一精品电影| 香蕉成人伊视频在线观看| 亚洲国产高清自拍| 国产精品护士白丝一区av| 久久久精品tv| 亚洲视频在线观看免费| 欧美a级大片| 午夜精品视频在线观看| 亚洲国产精品黑人久久久 | 久久久久久久精| 亚洲免费电影在线观看| 久久精品日产第一区二区三区| 亚洲国产精品一区二区尤物区 | 久久视频一区| 99www免费人成精品| 国产区在线观看成人精品| 麻豆九一精品爱看视频在线观看免费| 日韩一区二区电影网| 麻豆精品精品国产自在97香蕉| 亚洲一区制服诱惑| 亚洲人成在线观看网站高清| 国产三区精品| 国产精品成人一区| 欧美xxx成人| 久久精品国亚洲| 亚洲素人在线| 亚洲精选久久| 亚洲国产福利在线| 久久全球大尺度高清视频| 国产精品99久久久久久久久 | 欧美午夜精品久久久久久超碰| 午夜日韩在线| 亚洲欧美清纯在线制服| 99精品久久|