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

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 夢在天涯 閱讀(2094) 評論(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

搜索

  •  

積分與排名

  • 積分 - 1817698
  • 排名 - 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>
              国产美女精品一区二区三区| 久久久99国产精品免费| 99re6热在线精品视频播放速度| 亚洲人成人77777线观看| 亚洲国产成人久久综合| 中文一区二区在线观看| 欧美在线观看视频一区二区三区 | 亚洲乱码国产乱码精品精天堂| 一区二区高清视频| 久久久不卡网国产精品一区| 亚洲国产精品毛片| 午夜精品久久久99热福利| 免费成人在线观看视频| 国产喷白浆一区二区三区| 亚洲美女福利视频网站| 久久亚洲风情| 亚洲欧美成人在线| 欧美精品午夜| 亚洲国产老妈| 久久久国产视频91| 亚洲视频一区在线| 亚洲在线视频一区| 亚洲精品乱码久久久久久黑人 | 性一交一乱一区二区洋洋av| 欧美gay视频激情| 激情懂色av一区av二区av| 亚洲一区二区网站| 亚洲激情网址| 免费成人av在线看| 玉米视频成人免费看| 午夜精品一区二区三区在线视| 亚洲国产精品va在线看黑人动漫| 欧美一区二区三区久久精品| 欧美日韩精品一区| 亚洲精品一区二区网址| 欧美成人视屏| 一区二区高清视频在线观看| 理论片一区二区在线| 欧美在线观看网址综合| 国产日韩一区二区三区在线播放 | 黑人极品videos精品欧美裸| 午夜精品免费| 亚洲自拍三区| 国产日本欧美视频| 久久九九久久九九| 性欧美长视频| 狠狠色综合网| 美女爽到呻吟久久久久| 久久久精品tv| 亚洲国产欧美一区二区三区久久 | 亚洲精选视频免费看| 欧美激情2020午夜免费观看| 亚洲日本理论电影| 亚洲国产精品va在看黑人| 欧美成va人片在线观看| 亚洲免费观看| 宅男在线国产精品| 国产美女精品人人做人人爽| 久久久久九九视频| 久久午夜精品| 日韩亚洲精品在线| 在线午夜精品| 国产在线拍揄自揄视频不卡99| 久久久精品国产一区二区三区| 久久国产手机看片| 99伊人成综合| 亚洲欧美春色| 亚洲国产精品国自产拍av秋霞| 亚洲第一偷拍| 欧美色道久久88综合亚洲精品| 香蕉av777xxx色综合一区| 久久成人综合视频| 99精品国产热久久91蜜凸| 亚洲午夜性刺激影院| 一色屋精品视频在线看| 亚洲精品视频在线观看网站| 国产三级欧美三级| 亚洲国产成人精品女人久久久 | 国产精品一区免费观看| 久久综合综合久久综合| 欧美激情综合亚洲一二区| 亚洲欧美色婷婷| 久久嫩草精品久久久久| 亚洲一区视频| 久久视频一区二区| 亚洲综合999| 猫咪成人在线观看| 午夜一区二区三区不卡视频| 欧美成人午夜激情视频| 久久精品国产久精国产思思| 欧美精品三级| 欧美va天堂| 国产欧美在线| 亚洲电影自拍| 国产精品99久久99久久久二8 | 小黄鸭精品密入口导航| 男男成人高潮片免费网站| 香蕉久久夜色精品国产| 欧美韩国日本综合| 久久综合电影| 国产伦精品一区二区三| 亚洲欧洲美洲综合色网| 永久域名在线精品| 亚洲欧美日韩精品在线| 亚洲欧美视频一区| 欧美日韩国产精品成人| 亚洲高清不卡| 激情自拍一区| 欧美一区二粉嫩精品国产一线天| 亚洲午夜在线观看视频在线| 欧美不卡在线| 欧美高清视频一区| 激情欧美一区| 久久av一区二区三区漫画| 久久成人精品一区二区三区| 国产精品久久久999| 亚洲无线视频| 性伦欧美刺激片在线观看| 国产精品成人一区二区艾草| 亚洲精品免费网站| 99在线|亚洲一区二区| 欧美理论大片| 99国产精品久久久久老师| 亚洲午夜久久久久久久久电影网| 欧美日韩精品一二三区| 亚洲视频在线免费观看| 欧美一级在线亚洲天堂| 国产视频精品xxxx| 久久精品国产99| 欧美韩国日本一区| 亚洲精品一区二区三区樱花 | 亚洲私人影院| 欧美中文字幕在线| 国产综合婷婷| 理论片一区二区在线| 亚洲精品1区2区| 亚洲欧美在线高清| 国产一区在线播放| 欧美+日本+国产+在线a∨观看| 亚洲精品久久久久久久久久久| 99视频有精品| 国产毛片一区二区| 麻豆成人综合网| 99精品视频免费观看| 久久精品综合网| 亚洲精品国产精品国自产在线| 欧美吻胸吃奶大尺度电影| 亚洲欧美日韩视频一区| 麻豆成人在线| 中文av一区二区| 国产一区二区三区高清播放| 欧美成人激情视频| 亚洲一区三区电影在线观看| 欧美freesex8一10精品| 久久亚洲综合色一区二区三区| 欧美高清视频一二三区| 亚洲欧美国内爽妇网| 永久域名在线精品| 欧美日一区二区在线观看| 欧美在线观看视频一区二区| 亚洲日本免费| 久久这里只精品最新地址| 亚洲网在线观看| 在线观看亚洲专区| 欧美日韩在线亚洲一区蜜芽| 久久免费视频这里只有精品| 一区二区久久久久| 亚洲大胆在线| 久久久久成人精品| 亚洲与欧洲av电影| 最新中文字幕亚洲| 国产一区av在线| 欧美性猛交xxxx乱大交蜜桃| 欧美a级一区| 久久精品官网| 亚洲综合激情| 在线亚洲国产精品网站| 91久久久久久| 噜噜噜噜噜久久久久久91| 午夜精品一区二区三区在线| 日韩小视频在线观看| 亚洲国产日本| 亚洲电影av| 激情综合在线| 国语自产精品视频在线看一大j8 | 亚洲欧洲日本mm| 伊人久久综合| 国产一区二区中文| 亚洲精一区二区三区| 欧美~级网站不卡| 看片网站欧美日韩| 老牛国产精品一区的观看方式| 午夜精品久久久久久99热| 亚洲午夜av电影| 一区二区三区日韩精品视频| 亚洲靠逼com| 亚洲精品久久久久久下一站 | 99精品热视频| 亚洲人精品午夜| 亚洲国语精品自产拍在线观看|