Visual C++ 的重大變更

本文件列出 Visual C++ 2010 中的重大變更。

Visual C++ 編譯器

  • auto 關鍵字有新的預設意義。 因為舊意義很少使用,大部分應用程式將不會受到這項變更的影響。

  • 加入新的 static_assert 關鍵字,如果程式碼中已有這個名稱的識別項,將會造成名稱衝突。

  • 對新 Lambda 標記法的支援不包括在 IDL uuid 屬性中撰寫沒有引號的 GUID 程式碼。

  • .NET Framework 4 加入了「毀損狀態」(Corrupted State) 例外狀況的概念,也就是讓處理序處於無法復原之毀損狀態的例外狀況。 根據預設,就算使用攔截所有例外狀況的 /EHa 編譯器選項,您也無法攔截毀損狀態例外狀況。

    若要明確攔截毀損狀態例外狀況,請使用 __try-__except 陳述式。 或者,也可以套用 [HandledProcessCorruptedStateExceptions] 屬性,讓函式攔截毀損狀態例外狀況。

    這項變更主要影響的對象,是可能需要攔截毀損狀態例外狀況的系統程式設計人員。 有八種例外狀況:STATUS_ACCESS_VIOLATION、STATUS_STACK_OVERFLOW、EXCEPTION_ILLEGAL_INSTRUCTION、EXCEPTION_IN_PAGE_ERROR、EXCEPTION_INVALID_DISPOSITION、EXCEPTION_NONCONTINUABLE_EXCEPTION、EXCEPTION_PRIV_INSTRUCTION 和 STATUS_UNWIND_CONSOLIDATE。 如需這些例外狀況的詳細資訊,請參閱 GetExceptionCode 巨集。

  • 修訂後的 /GS 編譯器選項可以防止緩衝區滿溢,比舊版中的選項更為周全。 這個版本會在堆疊中穿插其他安全性檢查,可能因此降低效能。 使用新的 __declspec(safebuffers) 關鍵字,即可指示編譯器不要插入特定函式的安全性檢查。

  • 如果您同時使用 /GL (整個程式最佳化)/clr (Common Language Runtime 編譯) 等編譯器選項進行編譯,將會略過 /GL 選項。 這種編譯器選項組合產生的效益不大,所以做了這項變更。 由於這項變更,本組建的效能也有所改善。

  • 三併詞支援在 Visual C++ 2010 中預設是停用的。 請使用 /Zc:trigraphs 編譯器選項來啟用三併詞支援。 三併詞由兩個連續問號 ("??") 後接唯一的第三個字元所組成。 編譯器會以對應的標點符號字元取代三併詞, 例如,編譯器會將 "??=" 三併詞取代為 '#' 字元。 如果 C 原始程式檔所用的字元集不含某些標點符號字元的方便圖形表示,可改為使用三併詞。

  • 連結器已不再支援進行 Windows 98 最佳化。 如果您指定 /OPT:WIN98/OPT:NOWIN98/OPT (最佳化) 選項就會產生編譯時期錯誤。

  • RuntimeLibraryDebugInformationFormat 建置系統屬性指定的預設編譯器選項已變更。 根據預設,這些建置屬性是在 Visual C++ 7.0 到 10.0 版建立的專案中指定的。如果要移轉 Visual C++ 6.0 建立的專案,請考慮是否要指定這些屬性的值。

    在 Visual C++ 2010 中,RuntimeLibrary = MultiThreaded (/MD)DebugInformationFormat = ProgramDatabase (/Zi)。 在 Visual C++ 9.0 中,RuntimeLibrary = MultiThreaded (/MT)DebugInformationFormat = Disabled

Common Language Runtime (CLR)

  • Microsoft C# 和 Visual Basic 編譯器現在可以產生「無主要 Interop 組件」(No Primary Interop Assembly,no-PIA)。 no-PIA 組件可以使用 COM 型別,而不需部署相關的主要 Interop 組件 (PIA)。 使用 Visual C# 或 Visual Basic 產生的 no-PIA 組件時,您必須在編譯命令中參考 PIA 組件,才能參考使用程式庫的任何 no-PIA 組件。

Visual C++ 專案和 MSBuild

  • Visual C++ 專案現在是以 MSBuild 工具為基礎。 因此,專案檔改用新的 XML 檔案格式和 .vcxproj 檔案後置字元。 Visual C++ 2010 會將舊版 Visual Studio 專案檔自動轉換為新的檔案格式。

    如果現有專案相依於舊版建置工具、VCBUILD.exe 或專案檔後置字元 .vcproj,這個專案就會受到影響。

  • 舊版 Visual C++ 支援晚期評估屬性工作表。 例如,父屬性工作表可以匯入子屬性工作表,而且父項可使用子項中定義的變數來定義其他變數。 晚期評估讓父項能在子屬性工作表匯入之前就使用子變數。 在 Visual C++ 2010 中,專案工作表變數未定義之前無法使用,因為 MSBuild 僅支援早期評估。

整合式開發環境

  • 「應用程式終止」(Application Termination) 對話方塊不再結束應用程式。

    在舊版中,當 abort()terminate() 函式關閉應用程式的零售版本時,C 執行階段程式庫會在主控台視窗或對話方塊中顯示應用程式終止訊息。 這則訊息大致是說:「本應用程式已要求執行階段以不尋常的方式結束。 如需詳細資訊,請洽詢應用程式的支援小組。」

    應用程式終止訊息是多餘的,因為 Windows 隨後就會顯示目前的終止處理常式,這通常是 Windows 錯誤報告 (Dr. Watson) 對話方塊,或是 Visual Studio 偵錯工具。 從 Visual Studio 2010 開始,C 執行階段程式庫不再顯示這則訊息。 此外,執行階段還會防止應用程式在偵錯工具啟動前結束。

    如果您需要依賴之前的應用程式終止訊息行為,這將是一項重大變更。

  • 特別是對於 Visual Studio 2010 而言,IntelliSense 無法用於 C++/CLI 程式碼或屬性、[尋找所有參考] 對區域變數沒有作用,而程式碼模型也不會從匯入的組件擷取型別名稱,也不會將型別解析為其完整名稱。

Visual C++ 程式庫

  • Visual C++ 中已加入 SafeInt 類別,因此不再提供個別下載。 如果您已開發同樣名為 "SafeInt" 的類別,這將是一項重大變更。

  • 程式庫部署模型不再使用資訊清單來尋找特定版本的動態連結程式庫。 取而代之的是,每個動態連結程式庫的名稱都包含版本號碼,而您可以使用該名稱來尋找程式庫。 如需詳細資訊,請參閱Visual C++ 2010 中的部署

  • 在 Visual Studio 舊版中,可以重建執行階段程式庫。 Visual C++ 2010 不再支援建置您自己的 C 執行階段程式庫檔案複本。

標準樣板程式庫

  • 許多標頭檔不再自動加入 <iterator> 標頭。 因此,如果您需要在 <interator> 標頭中支援定義的獨立 Iterator,請改為明確加入這個標頭。

  • 在 <algorithm> 標頭中,移除了 checked_* 和 unchecked_* 函式, 而在 <iterator> 標頭中,移除了 checked_iterator 類別,加入 unchecked_array_iterator 類別。

  • 已移除 CComPtr::CComPtr(int) 建構函式。 此建構函式可允許從 NULL 巨集建構 CComPtr 物件,但此動作沒有必要且會允許來自非零整數的無意義建構。

    目前仍然可以從 NULL 建構 CComPtr 且定義為 0,但如果從常值 0 以外的整數進行建構則會失敗。 您最有可能在下列虛擬程式碼所述的情形中碰到這個問題。

    pair<X, CComPtr<T>> myVar;
    myVar = make_pair(x, NULL);
    

    若要修正第二個陳述式,請使用 nullptr 關鍵字,而不要使用 NULL 巨集。

    myVar = make_pair(x, nullptr)
    
  • 已移除下列 ctype 成員函式:ctype::_Do_narrow_sctype::_Do_widen_sctype::_narrow_sctype::_widen_s。 如果應用程式使用其中一個成員函式,則必須替換為對應的不安全版本:ctype::do_narrowctype::do_widenctype::narrowctype::widen

CRT、MFC 和 ATL 程式庫

  • 已移除對使用者建置 CRT、MFC 和 ATL 程式庫的支援。 例如,沒有提供適當的 nmake 檔案。 不過,使用者仍然可以存取這些程式庫的原始程式碼。 此外,Visual C++ Team Blog 也會張貼說明 Microsoft 用來建置這些程式庫之 MSBuild 選項的文件。

  • 已移除 MFC 對 IA64 的支援。 不過,仍然為 IA64 上的 CRT 及 ATL 提供支援。

  • MFC 模組定義 (.def) 檔案中不再重複使用序數。 這項變更意味著,次要版本之間的序數將有所不同,並且會改善服務套件與快速檢修版本的二進位相容性。

  • 已將新的虛擬函式新增至 CDocTemplate 類別。 這個新的虛擬函式為 CDocTemplate::OpenDocumentFile。 舊版的 OpenDocumentFile 有兩個參數。 新的版本則有三個參數。 若要支援重新啟動管理員,所有衍生自 CDocTemplate 的類別都必須實作有三個參數的版本。 如需函式的詳細資訊,請參閱 CDocTemplate::OpenDocumentFile。 新的參數是 bAddToMRU。

巨集和環境變數

  • 不再支援環境變數 __MSVCRT_HEAP_SELECT。 這個環境變數已移除,而且沒有取代項目。

Microsoft Macro Assembler 參考

請參閱

其他資源

Visual C++ 2010 使用者入門