共用方式為


Visual Studio 2019 中 C++ 的新功能

Visual Studio 2019 有多個 Microsoft C++ 環境的更新與修正。 我們已修正編譯器和工具中的許多錯誤 (Bug) 與問題。 其中多是客戶透過 [傳送意見反應] 底下的 回報問題提供建議 選項提交而來。 感謝您回報 Bug!

如需有關所有 Visual Studio 新功能的詳細資訊,請瀏覽 Visual Studio 2019 的新功能。 如需有關 Visual Studio 2017 中 C++ 新功能的資訊,請參閱 Visual Studio 2017 中 C++ 的新功能。 如需有關 Visual Studio 2015 和更舊版本中 C++ 新功能的資訊,請參閱從 2003 到 2015 的 Visual C++ 新功能。 如需詳細資訊,請參閱 Microsoft C++ 文件:新增功能

Visual Studio 16.11 版中 C++ 的新功能

如需 Visual Studio 16.11 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.11 版的新功能

  • 編譯器現在支援 /std:c++20 編譯器模式。 先前,C++20 功能只能在 Visual Studio 2019 的 /std:c++latest 模式中使用。 原本需要 /std:c++latest 模式的功能現在可在最新版 Visual Studio的 /std:c++20 模式或更新版本中運作。

  • Visual Studio 隨附的 LLVM 工具已升級至 LLVM 12。 如需詳細資訊,請參閱 LLVM 發行備註

  • Clang-cl 支援已更新為 LLVM 12。

Visual Studio 16.10 版中 C++ 的新功能

如需 Visual Studio 16.10 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.10 版的新功能

  • 所有 C++20 功能現在都可在 /std:c++latest 之下取得。 儘管 Microsoft Visual C++ 對 C++20 標準 (目前由 ISO 發佈) 的實作已經完成,但是一些關鍵的 C++20 程式庫功能預計會由即將發佈的瑕疵報告 (ISO C++20 錯誤修正) 進行修改,這些瑕疵報告可能會以一種 ABI 不相容的方式對它們進行變更。 如需詳細資訊,請參閱 Microsoft/STL 問題 #1814

    • 16.10 中已新增 C++20 即時函式和 constinit 支援
    • 最後的 <chrono>片段:新的時鐘、閏秒、時區和剖析
    • 文字格式設定的 <format> 實作
  • 除了 x64 之外,x86 和 ARM64 現在也提供 /openmp:llvm

  • 現在可以使用自訂的編譯警告層級和程式碼分析設定,將 Include 目錄指定為外部目錄。

  • 已新增 /await:strict 選項,以在舊版語言模式中啟用 C++20 樣式協同程式。

  • std::coroutine_handle<T> 的偵錯工具視覺效果現在會顯示原始協同程式函式名稱和簽章,以及目前的暫止點。

  • 已新增 CMakePresets 的支援。

  • 在 Visual Studio 中新增遠端連線時,您現在必須接受或拒絕伺服器所提供的主機金鑰指紋。

  • 已將 /external 參數新增至 Microsoft Visual C++,以指定應該視為外部的標頭,以供警告之用。

Visual Studio 16.9 版中 C++ 的新功能

如需 Visual Studio 16.9 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.9 版的新功能

  • Address Sanitizer

    • 我們在 Windows 上的 Address Sanitizer 支援現已退出實驗性模式,且已正式提供一般使用。

    • 已擴充 RtlAllocateHeap 支援、修正 RtlCreateHeapRtlAllocateHeap 攔截器在建立可執行檔記憶體集區時的相容性問題。

    • 已新增對舊版 GlobalAllocLocalAlloc 記憶體函式系列的支援。 您可以設定環境旗標 ASAN_OPTIONS=windows_hook_legacy_allocators=true來啟用這些攔截器。

    • 已更新陰影記憶體交錯和攔截失敗的錯誤訊息,以明確顯示問題與解決方案。

    • IDE 整合現在可以處理 ASan 所能回報的完整例外狀況集合。

    • 如果編譯器與連結器偵測到您正在使用 ASan 進行建置,但並未發出偵錯資訊,其將會建議發出偵錯資訊。

  • 您現在可以使用新的 CL 參數 /openmp:llvm,將目標設為 OpenMP 執行階段的 LLVM 版本。 這能加入在 #pragma omp 區段上使用 lastprivate 子句,以及針對 for 迴圈使用平行的不帶正負號索引變數的支援。 /openmp:llvm 參數目前只能針對 amd64 目標使用,且仍處於實驗階段。

  • Visual Studio CMake 專案現已具有針對遠端 Windows 開發的一級支援。 這包括設定 CMake 專案以將 Windows ARM64 設為目標、將專案部署到遠端 Windows 電腦,以及從 Visual Studio 針對遠端 Windows 電腦上的專案進行偵錯。

  • 隨附於 Windows 版 Visual Studio 的 Ninja 版本已更新到 1.10 版。 如需包含項目的詳細資訊,請參閱 Ninja 1.10 發行備註

  • 隨附於 Visual Studio 的 CMake 版本已經更新到 3.19 版。 如需包含項目的詳細資訊,請參閱 CMake 3.19 發行備註

  • 已將 STL 中許多 lock/guard 型別標示為 nodiscard

  • IntelliSense:

  • MSVC 現在可判斷二進位檔所需的正確位址清理程式執行階段。 Visual Studio 專案會自動取得新的變更。 在命令列上使用位址清理程式時,現在只需要將 /fsanitize=address 傳遞給編譯器即可。

  • Visual Studio 的連線管理員現在支援使用 ECDSA 公開金鑰演算法的私密金鑰。

  • 安裝程式隨附的 LLVM 與 Clang 版本已更新為 v11。 如需詳細資訊,請參閱 LLVMClang 的版本資訊。

  • Visual Studio 現在會使用工具鏈檔案中的 CMake 變數來設定 IntelliSense。 這會為內嵌式和 Android 開發提供更佳體驗。

  • 實作 More Constexpr Containers 提議,其允許使用解構函式與新運算式作為 constexpr。 這讓 constexprstd::vectorstd::string 等公用程式更容易使用。

  • 針對 C++20 模組 IntelliSense 擴充支援,包括移至定義、移至模組及成員自動完成。

  • MSVC 編譯器現在支援縮寫的函式範本

Visual Studio 16.8 版中 C++ 的新功能

如需 Visual Studio 16.8 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.8 版的新功能

  • C++20 協同程式現在在 /std:c++latest (或是從 Visual Studio 2019 16.11 版開始的 /std:c++20) 和 <coroutine> 標頭下支援。

  • IntelliSense 現在支援 C++20 <concepts><ranges> 標頭,且可重新命名與瀏覽概念定義。

  • STL 現在支援大部分的 C++20 範圍。

  • MSVC 現在支援 Conditionally trivial special member functions (有條件的 trivial 特殊成員函式)。

  • /std:c11/std:c17 參數現在支援 C11 和 C17。

  • 其他 STL 改善包括完整支援 std::atomic_refstd::midpointstd::lerp 以及 std::execution::unseqstd::reverse_copy 最佳化等等。

  • 已將 Visual Studio 隨附的 CMake 版本升級為 CMake 3.18 \(英文\)。

  • 程式碼分析工具現在支援 SARIF 2.1 標準:靜態分析記錄格式的業界標準。

  • 現在,遺失 Linux 專案的建置工具會在工具列中發出警告,並在錯誤清單中清楚描述遺失的工具。

  • 您現在可偵錯遠端 Linux 系統上的 Linux 核心傾印,或直接從 Visual Studio 偵錯 WSL。

  • 針對產生的 C++ Doxygen 註解,我們新增了其他註解樣式選項 (/*!//!)。

  • 其他 vcpkg 公告

  • 未評估之上下文中的 lambdas 編譯器支援。

  • 由多執行緒 PDB 建立改善的 /DEBUG:FULL 連結效能。 數個大型應用程式與 AAA 遊戲的連結速度會快 2 到 4 倍。

  • Visual Studio 偵錯工具現在支援 char8_t

  • 支援使用 clang-cl 的 ARM64 專案。

  • Intel AMX 內建函式支援。

Visual Studio 16.7 版中 C++ 的新功能

如需 Visual Studio 16.7 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.7 版的新功能

  • 遠端 C++ 支援現在支援更廣泛的 Linux distro 與 Shell,包括 sh、csh、bash、tsch、ksh、zsh 與 dash。 您可透過 ConnectionManager.exe 來修改新的 "shell" 屬性,以覆寫遠端連線的 shell 選擇。 這項支援已使用以遠端 Linux 系統或 WSL 為目標的 MSBuild 型 Linux 專案與 CMake 專案來進行測試。

  • 您現在可使用 Ninja (非常快速地評估累加建置的建置系統),以改善 MSBuild 型 Linux 專案的累加建置時間。 您可透過在 [一般] 屬性頁中,將 [啟用累加建置] 設定為 [使用 Ninja],以選擇使用這項功能。 Ninja (Ninja 式建置) 必須安裝在遠端 Linux 系統或 WSL 上。

  • 實作了新的 C++20 標準程式庫功能。 如需詳細清單,請參閱 GitHub 上的 STL 變更記錄

  • 您現可在連線管理員中編輯和設定預設的遠端 SSH 連線。 這表示您可以編輯現有的遠端連線 (例如其 IP 位址變更時),並在 CMakeSettings.json 和 launch.vs.json 中設定要使用的預設連線。 遠端 SSH 連線可讓您直接在 Visual Studio 中,建置及偵錯位於遠端 Linux 系統的 C++ 專案。

  • 在 Visual Studio 中增強了 Windows 上的 Clang (clang-cl) IntelliSense 支援。 Clang 的 include 路徑現在包含 clang 程式庫,我們改善了使用 std 程式庫時的編輯器內波浪線顯示,並且在 clang 模式中新增了 C++2a 的支援。

  • 您現在可以嘗試將程式碼錯誤加上底線,並在 C++ 專案中查看更多建議的快速修正。 在 [工具] > [選項] > [文字編輯器] > [C/C++] > [實驗] 底下啟用此功能。 將 [停用實驗性程式碼 Linter] 設為 false。 前往 C++ 小組部落格深入了解。

  • 我們已新增四個新的程式碼分析規則,以將其他安全性功能納入 C++:C26817C26818C26819C26820

  • 我們已針對在具有 gdbserver 的遠端系統上對 CMake 專案進行偵錯新增第一級支援。

  • 在 Visual Studio 中使用適用於 C++ 之 AddressSanitizer 的實驗性實作 (現已可供 x64 原生專案使用),輕鬆地找出記憶體損毀錯誤。 我們現在也支援使用偵錯執行階段 (/MTd/MDd/LDd)。

  • IntelliSense 現已提供概念、指定初始設定式,以及其他數個 C++20 功能的基本支援。

  • .ixx.cppm 檔案現已識別為 C++,而且語法螢光筆與 IntelliSense 也會將其當成 C++ 處理。

Visual Studio 16.6 版中 C++ 的新功能

如需 Visual Studio 16.6 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.6 版的新功能

  • 改善的 Doxygen/XML 註解產生:在函式上方輸入 ////**,即會自動產生 Doxygen 或 XML 文件註解虛設常式。 這些資訊現在也會顯示在快速諮詢工具提示中。

  • 適用於 Linux/WSL 的 CMake Ninja 支援: 在 WSL 或遠端系統上建置 CMake 專案時,請使用 Ninja 作為基礎產生器。 在新增 Linux 或 WSL 設定時,Ninja 現在是預設的產生器。

  • 遠端 CMake 偵錯的偵錯範本: 我們已在遠端 Linux 系統或使用 gdb 的 WSL 上簡化其 CMake 專案偵錯範本。

  • C++20 概念的初始支援: IntelliSense 現在可辨識 C++20 概念 ,並在成員清單中建議。

Visual Studio 16.5 版中 C++ 的新功能

如需 Visual Studio 16.5 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.5 版的新功能

  • IntelliCode 小組完成模型和成員變數支援:C++開發人員現在可以在自己的程式碼基底上訓練 IntelliCode 模型。 我們稱其為小組完成模型,因為您可以從您的小組做法中受益。 此外,我們還改善了成員變數的 IntelliCode 建議。

  • IntelliSense 改良功能:

    • IntelliSense 現在可在處理標準程式庫時,顯示更容易讀取的型別名稱。
    • 我們新增了將 EnterSpaceTab 函式切換為認可字元的功能,並且可以將 Tab 切換為是否用來插入程式碼片段。 您可以在 [工具] > [選項] > [文字編輯器] > [C/C++] > [進階] > [IntelliSense] 底下找到這些設定。
  • 命令列上的連線管理員: 您現在可以透過命令列,與預存遠端連線互動。 這適用於佈建新的開發機器或在持續整合中設定 Visual Studio 等工作。

  • WSL 的偵錯和部署:使用 Visual Studio 的原生支援,以便 WSL 從遠端部署系統,將您的建置系統區隔開來。 您現在能以原生方式在 WSL 上進行建置,並將組建成品部署到第二個遠端系統以便偵錯。 CMake 專案和以 MSBuild 為基礎的 Linux 專案都支援此工作流程。

  • FIPS 140-2 合規性模式的支援:Visual Studio 現在會在開發以遠端 Linux 系統為目標的 C++ 應用程式時,支援 FIPS 140-2 合規性模式。

  • CMake 語言檔案語言服務和更佳的 CMake 專案操作:

    • 以遠端 Linux 系統為目標的 CMake 專案原始程式檔複本已經過最佳化。 Visual Studio 現在會保留從遠端複製的最後一組來源「指紋檔案」,並根據已變更的檔案數目來最佳化行為。

    • 現在,CMake 指令碼檔案中的函式、變數和目標支援程式碼瀏覽功能,例如「移至定義」和「尋找所有參考」。

    • 在 CMake 專案中,從 IDE 新增、移除和重新命名原始程式檔和目標,而不需要手動編輯您的 CMake 指令碼。 當使用 [方案總管] 新增或移除檔案時,Visual Studio 會自動編輯您的 CMake 專案。 您也可以從 [方案總管] 的 [目標] 檢視中新增、移除及重新命名專案的目標。

  • Linux 專案改善:Visual Studio Linux 專案現在具有更精確的 IntelliSense,可讓您依專案來逐一控制遠端標頭同步處理。

Visual Studio 16.4 版中 C++ 的新增功能

如需 Visual Studio 16.4 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.4 版的新功能

  • 無論您是使用 Clang 或 MSVC 工具組,Code Analysis 現在都可針對 MSBuild 和 CMake 專案,以原生方式支援 Clang-Tidy。 clang-tidy 檢查可作為背景程式碼分析的一部分來執行、顯示為編輯器內的警告 (波浪線),以及顯示在錯誤清單中。

  • Visual Studio CMake 專案現在具有 [概觀] 頁面,可協助您開始進行跨平台開發。 這些頁面是動態的,可協助您連線至 Linux 系統,並將 Linux 或 WSL 組態新增至 CMake 專案。

  • CMake 專案的啟動下拉式功能表現在會顯示您最近使用過的目標,並可加以篩選。

  • C++/CLI 現在支援在 Windows 上搭配 .NET Core 3.1 或更新版本使用 interop。

  • 您現在能為 Windows 上以 MSVC 編譯的專案啟用 ASan,以進行 C++ 程式碼的執行階段檢測,其可協助偵測記憶體錯誤。

  • MSVC 的 C++ 標準程式庫更新:

    • C++17:實作 to_chars() 一般精確度,完成 P0067R5 基礎字串轉換 (charconv)。 這會完成 C++17 標準中所有程式庫功能的實作。
    • C++20:實作 P1754R1 將概念重新命名為 standard_case。 若要包含這些功能,請使用 /std:c++latest 編譯器選項 (或是從 Visual Studio 2019 16.11 版開始的 /std:c++20)。 您也可以使用 [C++ 語言標準] 屬性,在 [設定屬性] > [C/C++] > [語言] [專案屬性] 頁面中設定選項。
  • 名為 [C++ Build Insights] 的新工具集合現已推出。 如需公告的詳細資訊,請參閱 C++ 小組部落格

Visual Studio 16.3 版中 C++ 的新功能

如需 Visual Studio 16.3 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.3 版的新功能

  • C++ 開發人員現在可以使用鍵盤快速鍵 Ctrl+KCtrl+/ 來切換行註解。

  • IntelliSense 成員清單現在會根據型別限定詞進行篩選,例如 const std::vector 現在會篩選掉例如 push_back 之類的方法。

  • 我們新增了這些 C++20 標準程式庫功能 (在 /std:c++latest 下提供,或是從 Visual Studio 2019 16.11 版開始的 /std:c++20):

    • P0487R1:修正 operator>>(basic_istream&, CharT*)
    • P0616R0:在 <numeric> 中使用 move()
    • P0758R1 \(英文\):is_nothrow_convertible
    • P0734R0:C++ 概念的擴充功能
    • P0898R3:標準程式庫概念
    • P0919R3:未具順序之容器的異質查閱
  • 新的 C++ Core 指導方針檢查,包括新的「列舉規則」規則集,以及其他constenum和型別規則。

  • 新的預設語義顏色標示配置可讓使用者更輕鬆地了解其程式碼;您可以設定呼叫堆疊視窗來隱藏範本引數,且 C++ IntelliCode 預設會開啟。

  • 在 launch.vs.json 和 tasks.vs.json 中的個別目標和工作上,使用 CMakeSettings.json 或 CppProperties.json 或是新的 "env" 標籤,來搭配環境變數設定偵錯目標和自訂工作。

  • 使用者現在可以對遺失的 vcpkg 套件使用快速動作,以自動開啟主控台並安裝至預設的 vcpkg 安裝。

  • 由 Linux 專案 (CMakeMSBuild) 完成的遠端標頭複製已最佳化,且現在會以平行方式執行。

  • Visual Studio 的 WSL 原生支援 \(英文\) 現在支援適用於 MSBuild 型 Linux 的平行建置。

  • 使用者現在可以指定要使用 Linux Makefile 專案部署至遠端系統的本機組建輸出清單。

  • CMake 設定編輯器 \(英文\) 中設定描述時,現在會包含更多內容和有用文件的連結。

  • IntelliCode 的 C++ 基本模型現在預設為啟用。 您可以前往 [工具]>[選項]>[IntelliCode] 來變更此設定。

Visual Studio 16.2 版中 C++ 的新功能

如需 Visual Studio 16.2 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.2 版的新功能

  • 對於設定了 Clang 的本機 CMake 專案,程式碼分析現在會執行 clang-tidy 檢查,並以編輯器內警告 (波浪線) 和錯誤清單中的一部分背景程式碼分析形式呈現。

  • 更新了 C++17 P0067R5 基礎字串轉換的 <charconv> 標頭:

    • 新增了 chars_format::fixedchars_format::scientific 有效位數的浮點數 to_chars() 多載 (chars_format::general precision 是唯一尚未實作的部分)
    • 最佳化 chars_format::fixed 最短
  • 已新增下列 C++20 標準程式庫功能:

    • /std:c++latest 底下提供 (或是從 Visual Studio 2019 16.11 版開始的 /std:c++20):
      • P0020R6atomic<floating-point>
      • P0463R1:由小到大的列舉
      • P0482R6:適用於 UTF-8 字元與字串的 char8_t 類型
      • P0653R2:用於將指標轉換為原始指標的 to_address()
    • /std:c++17/std:c++latest 底下提供 (或是從 Visual Studio 2019 16.11 版開始的 /std:c++20):
      • P0600R1:程式庫中的[[nodiscard]]
    • 無條件可用:
      • P0754R2<version> 標頭
      • P0771R1std::function 移動建構函式應為 noexcept
  • Windows SDK 不再是 CMake for Windows 和 CMake for Linux 元件的相依性。

  • C++ 連結器的改善,可大幅改善最大輸入的反覆項目建置時間。 /DEBUG:FAST/INCREMENTAL 平均速度為兩倍快,/DEBUG:FULL 速度現在快三到六倍。

Visual Studio 16.1 版中 C++ 的新功能

如需 Visual Studio 16.1 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.1 版的新功能

C++ 編譯器

  • 這些 C++20 功能已在 C++ 編譯器中實作,可在 /std:c++latest 底下取得 (或是從 Visual Studio 2019 16.11 版開始的 /std:c++20):

    • 為具有明確範本引數的函式呼叫運算式,增加透過依引數不同的查閱來尋找函式範本的功能 (P0846R0)。
    • 指定的初始化 (P0329R4),讓特定成員可在彙總初始化中選取,例如使用 Type t { .member = expr } 語法。
  • Lambda 支援已經過全面檢修,解決了長久以來的大量問題。 根據預設,此變更會在使用 /std:c++20/std:c++latest 時啟用。 在 /std:c++17 語言模式和預設 (/std:c++14) 模式下,可以使用 Visual Studio 2019 16.9 版或更新版本中的 /Zc:lambda 來啟用新的剖析器 (先前在 Visual Studio 2019 16.3 版中,以 /experimental:newLambdaProcessor 開始提供),例如 /std:c++17 /Zc:lambda

C++ 標準程式庫改善

  • 下列 C++20 功能已新增到 C++ 標準程式庫的實作,並於 /std:c++latest 底下提供:
    • 用於 basic_stringbasic_string_viewstarts_withends_with
    • 關聯容器的 contains
    • listforward_listremoveremove_ifunique 現在會傳回 size_type
    • shift_leftshift_right 已新增到 <algorithm>

C++ IDE

適用於 C++ 的 IntelliCode

IntelliCode 現在是以「使用 C++ 的桌面開發」 工作負載中的選擇性元件形式提供。 如需詳細資訊,請參閱改良了C++ IntelliCode 現在隨附於 Visual Studio 2019

IntelliCode 會使用本身密集的訓練與您的程式碼上下文,將您最可能使用的項目放在完成清單頂端。 它通常不需要向下捲動清單。 針對 C++,當您使用標準程式庫之類的熱門程式庫時,IntelliCode 的幫助最大。

新的 IntelliCode 功能 (自訂模型、C++ 支援及 EditorConfig 推斷) 預設會停用。 若要啟用,請移至 [工具] > [選項] > [IntelliCode] > [一般]。 這個 IntelliCode 版本改善了正確性,並包含可用函式的支援。 如需詳細資訊,請參閱 AI-Assisted Code Completion Suggestions Come to C++ via IntelliCode (透過 IntelliCode 可實現 C++ 的 AI 輔助程式碼完成建議)。

快速資訊改善

  • 快速諮詢工具提示現在會遵守您編輯器的語意色彩標示。 也有新的線上搜尋連結,此連結可用來搜尋線上文件,以深入了解動態顯示程式碼建構。 針對具有紅色波浪線的程式碼,由 Quick Info 提供的連結連結將會在線上搜尋錯誤。 這樣您就不需要在瀏覽器中重新輸入訊息。 如需詳細資訊,請參閱 Visual Studio 2019 中的 Quick Info 改善:色彩標示與線上搜尋

一般改善

  • 範本列可依據該範本在您程式碼基底中的具現化來填入下拉式功能表。

  • 如果缺少 #include 指示詞會出現燈泡,並可透過 vcpkg 安裝,CMake find_package 指示詞則有可用套件的自動完成。

  • 已修訂 C++專案的一般屬性頁。 現在,某些選項會列在新的 [進階] 頁面底下。 [進階] 頁面也包括偏好工具組架構、偵錯程式庫、MSVC 工具組次要版本及 Unity (jumbo) 組建的新屬性。

CMake 支援

  • 我們已將 Visual Studio 隨附的 CMake 版本更新為 3.14。 此版本新增了以 Visual Studio 2019 專案為目標的 MSBuild 產生器內建支援,以及檔案型的 IDE 整合 API。

  • 我們已新增 CMake 設定編輯器的功能改進,包括 Linux 的 Windows 子系統 (WSL) 支援及來自現有快取的設定、預設建置與安裝根目錄的變更,以及 Linux CMake 設定中環境變數的支援。

  • 完成項和內建 CMake 命令、變數及屬性的快速資訊,讓您在編輯 CMakeLists.txt 檔案時更加輕鬆。

  • 我們已提供使用 Clang/LLVM 編輯、建置及針對 CMake 專案進行偵錯的整合式支援。 如需詳細資訊,請參閱 Visual Studio 中的 Clang/LLVM 支援 \(英文\)。

Linux 和適用於 Linux 的 Windows 子系統

程式碼分析

遠端組建

  • 現在,在 MSBuild 和 CMake 專案中以 Linux 為目標時,使用者可將遠端組建電腦從遠端偵錯電腦分隔開來。

  • 遠端連線改良的記錄讓跨平台開發的問題變得容易診斷。

Visual Studio 16.0 版中 C++ 的新功能

如需 Visual Studio 16.0 版新功能和錯誤修正的摘要,請參閱 Visual Studio 2019 16.0 版的新功能

C++ 編譯器

  • 增強支援 C++17 功能與正確性修正,加上 C++20 功能 (例如模組和協同程式) 的實驗性支援。 如需詳細資訊,請參閱 Visual Studio 2019 中的 C++ 一致性改善

  • /std:c++latest 選項現在會包含不一定完整的 C++20 功能,包括對使用 C++20 運算子 <=> (「太空船」) 的初步支援,以進行三向比較。

  • C++ 編譯器參數 /Gm 現已被取代。 若已明確定義 /Gm 參數,請考慮將它從您的組建指令碼中停用。 或者,您也可以安全地忽略 /Gm 的過時警告,因為當使用 [將警告視為錯誤] (/WX) 時不會將它視為錯誤。

  • 隨著 MSVC 開始實作來自 C++20 標準版草稿的功能 (在 /std:c++latest 旗標下),/std:c++latest 現在與 /clr (所有版本)、/ZW/Gm 不相容。 在 Visual Studio 2019 中,當使用 /clr/ZW/Gm 編譯時,請使用 /std:c++17/std:c++14 模式 (但請參閱先前的項目符號內容)。

  • 根據預設,C++ 主控台和傳統型應用程式不再產生先行編譯標頭檔。

Codegen、安全性、診斷和版本控制

改善對 /Qspectre 的分析,以提供對 Spectre 變體 1 (CVE-2017-5753) 的風險降低協助。 如需詳細資訊,請參閱 Spectre mitigations in MSVC (MSVC 中的 Spectre 風險降低)。

C++ 標準程式庫改善

  • 額外 C++17 與 C++20 程式庫功能與正確性修咒的實作。 如需詳細資訊,請參閱 Visual Studio 2019 中的 C++ 一致性改善

  • 我們已將 Clang 格式套用至 C++ 標準程式庫標頭,以改善可讀性。

  • 因為 Visual Studio 現在針對 C++ 支援 Just My Code,因此標準程式庫再也不需要為 std::functionstd::visit 提供自訂機器,就可以達到相同的效果。 大幅移除該機器對使用者沒有可見的影響。 但編譯器將不再產生指出 <type_traits><variant> 第 15732480 或 16707566 行發生問題的診斷。

編譯器和標準程式庫在效能/輸送量方面的改進

  • 改善建置輸送量,包括連結器對檔案 I/O 的處理方式,以及合併與建立 PDB 類型的連結時間。

  • 新增了 OpenMP SIMD 向量化的基本支援。 您可以使用新的編譯器參數 /openmp:experimental 來啟用它。 此選項讓標註了 #pragma omp simd 的迴圈有機會向量化。 向量化並不保證會發生,而已標註但未向量化的迴圈會收到回報的警告。 不支援任何 SIMD 子句;系統會忽略這些子句並回報警告。

  • 新增了內嵌命令列參數 /Ob3,這是比 /Ob2 更為積極的版本。 /O2 (將二進位檔最佳化以提高速度) 仍預設表示 /Ob2。 若您發現編譯器的內嵌不夠積極,請考慮傳遞 /O2 -Ob3

  • 我們已新增 Short Vector Math Library (SVML) 內建函式的支援。 這些函式可計算 128 位元、256 位元或 512 位元的向量對等項目。 這是為了支援包含數學程式庫函式及其他特定運算 (例如整數除法) 呼叫的迴圈手動向量化。 若要了解支援函式的定義,請參閱 Intel Intrinsic Guide

  • 新增及改進的最佳化:

    • 為使用 SIMD 向量內建函式的運算式提供常數摺疊和算數簡化,浮點數和整數形式均適用。

    • 有更強大的分析可從控制流程 (if/else/switch 陳述式) 擷取資訊,以移除總是證實為 true 或 false 的分支。

    • 改進了 memset 展開,以使用 SSE2 向量指令。

    • 改進了無用結構/類別複本的移除作業,尤其是依值傳遞的 C++ 程式。

    • 改進了使用 memmove 的程式碼最佳化,例如 std::copystd::vectorstd::string 建構。

  • 已將標準程式庫的實體設計最佳化,以避免編譯未直接包含標準程式庫的部分。 此變更會針對只含 <vector> 的空檔案省下一半的建置時間。 因此,您可能必須為先前間接包含的標頭加入 #include 指示詞。 例如,使用 std::out_of_range 的程式碼現在可能必須加入 #include <stdexcept>。 使用串流插入作業的程式碼現在可能必須加入 #include <ostream>。 優點是只有實際使用 <stdexcept><ostream> 元件的轉譯單位才必須支付編譯的輸送量成本。

  • if constexpr 已套用到標準程式庫中的更多位置,以便在複製作業、反向與旋轉的排列組合,以及平行演算法程式庫中,提高輸送量並降低程式碼大小。

  • 標準程式庫現在會在內部使用 if constexpr 來減少編譯時間 (即使是在 C++14 模式中)。

  • 平行演算法程式庫的執行階段動態連結偵測已不再使用整個頁面來存放函式指標陣列。 將此記憶體標示為唯讀已被視為與安全性目的不再相關。

  • std::thread 的建構函式已不會再等候該執行緒啟動,而且已不會再於底層 C 程式庫 _beginthreadex 與提供的可呼叫物件之間插入這麼多層函式呼叫。 先前 std::thread 將六個函式放在 _beginthreadex 與提供的可呼叫物件之間。 此數字已減少到只有三個,其中兩個只是 std::invoke。 此變更也可解決 std::thread 建構函式會在系統時鐘於 std::thread 建立時,因變更而停止回應的問題。

  • 已修正 std::hash 中的效能迴歸,這是我們在實作 std::hash<std::filesystem::path> 時所引進的功能。

  • 標準程式庫現在會在數個地方使用解構函式來達到正確性,而非使用 Catch 區塊。 這讓我們提供更好的偵錯工具互動;您在受影響位置透過標準程式庫擲回的例外狀況現在將顯示為從其原始擲回網站擲回,而非我們的重新擲回。 並非所有標準程式庫 catch 區塊都已消除。 我們預期 MSVC 的後續版本會減少 catch 區塊數目。

  • std::bitset 中由 noexcept 函式內的條件式擲回導致的次佳 codegen 已透過鑽研出擲回路徑而修正。

  • std::liststd::unordered_* 系列在內部的許多位置使用非偵錯列舉程式。

  • 數個 std::list 成員已變更為儘可能重複使用清單節點,而非解除配置並重新配置它們。 例如,假設已經有大小為 3 的 list<int>,對 assign(4, 1729) 的呼叫現在會在前 3 個清單節點中覆寫 int 值,並配置一個值為 1729 的新清單節點。

  • erase(begin(), end()) 的所有標準程式庫呼叫都已變更為 clear()

  • std::vector n現在會在特定案例中以更有效率的方式初始化及擦除元素。

  • 改善 std::variant,讓它更適用於更最佳化工具,以產生更好的程式碼。 現在,內嵌程式碼搭配 std::visit 的效果更好。

C++ IDE

支援 Live Share C++

Live Share 現已支援 C++,可讓開發人員使用 Visual Studio 或 Visual Studio Code 即時共同作業。 如需詳細資訊,請參閱推出 C++ Live Share:實時共用和共同作業

範本 IntelliSense

範本列現在使用瞄孔 Window UI 來取代強制回應視窗、支援巢狀範本,並會將任何預設引數預先填入瞄孔視窗中。 如需詳細資訊,請參閱 Template IntelliSense Improvements for Visual Studio 2019 Preview 2 (Visual Studio 2019 Preview 2 的範本 IntelliSense 改善)。 範本列中的 [最近使用] 下拉式清單,可讓您在前一組範例引數之間快速切換。

新的啟動視窗體驗

啟動 IDE 時,會出現新的 [開始] 視窗。 這可讓您開啟最近使用的專案、從原始檔控制複製程式碼、以方案或資料夾形式開啟本機程式碼,或建立新的專案。 [新增專案] 對話方塊也大幅修改為易於搜尋的可篩選體驗。

部分專案範本的新名稱

我們已修改數個專案範本名稱與描述,以符合更新的 [新增專案] 對話方塊。

各種生產力改善功能

Visual Studio 2019 包含的下列功能可協助您更輕鬆且更直覺地撰寫程式碼:

  • 快速修正:
    • 新增缺少的 #include
    • NULL 移至 nullptr
    • 加入遺漏的分號
    • 解決遺漏命名空間或範圍的問題
    • 取代不正確的間接取值運算元 (*& 以及 &*)
  • 將滑鼠游標停留在右括號,可顯示區塊的快速諮詢
  • 瞄孔標頭/程式碼檔
  • #include 的 [移至定義] 可開啟檔案

如需詳細資訊,請參閱 C++ Productivity Improvements in Visual Studio 2019 Preview 2 (Visual Studio 2019 Preview 2 中的 C++ 生產力改善功能)。

CMake 支援

  • CMake 3.14 的支援

  • Visual Studio 現在可以開啟外部工具所產生的現有 CMake 快取,例如 CMakeGUI、自訂的中繼組建系統,或可自動叫用 cmake.exe 的組建指令碼。

  • 改善的 IntelliSense 效能。

  • 新的設定編輯器可當成手動編輯 CMakeSettings.json 檔的替代方式,而且與 CMakeGUI 有部分同位。

  • Visual Studio 藉由偵測您的 Linux 電腦上是否有相容的 CMake 版本,協助您在 Linux 上使用 CMake 啟動 C++ 開發。 若沒有,則會為您安裝。

  • CMakeSettings 中不相容的設定 (例如不相符的架構或不相容的 CMake 產生器設定) 會在 JSON 編輯器中顯示波浪線,並在錯誤清單中顯示錯誤。

  • 只要執行了 vcpkg integrate install,就會為 IDE 中開啟的 CMake 專案自動偵測和啟用 vcpkg 工具鏈。 您可透過在 CMakeSettings 中指定空白的工具鏈檔案來關閉這個行為。

  • 根據預設,CMake 現在會啟用 Just My Code 偵錯。

  • 靜態分析警告現在可在背景處理,以及在 CMake 專案的編輯器中顯示。

  • 為 CMake 專案新增了更清楚的建置及設定「開始」和「結束」訊息,及 Visual Studio 建置進度 UI 的支援。 此外,[工具] > [選項] 中現在有 CMake 詳細資訊設定,可用來自訂輸出視窗中的 CMake 組建詳細等級及設定訊息。

  • CMakeSettings.json 中現在支援 cmakeToolchain 設定,不必手動修改 CMake 命令列就能指定工具鏈。

  • 新增 [全部建置] 功能表捷徑 Ctrl+Shift+B

IncrediBuild 整合

IncrediBuild 現在是以「使用 C++ 的桌面開發」 工作負載中的選擇性元件形式提供。 IncrediBuild 建置監視器已完全整合在 Visual Studio IDE 中。 如需詳細資訊,請參閱使用 IncrediBuild 的建置監視器與 Visual Studio 2019 來視覺化您的建置

偵錯

  • 針對在 Windows 上執行的 C++ 應用程式,PDB 檔案現在會在個別的 64 位元處理序上載入。 這項變更可解決偵錯工具記憶體不足所造成的當機範圍。 例如,偵錯包含大量模組和 PDB 檔案的應用程式時。

  • 搜尋已在 [監看式]、[自動變數] 與 [區域變數] 視窗中啟用。

使用 C++ 進行 Windows 桌面開發

  • 下列 C++ ATL/MFC 精靈已無法再使用:

    • ATL COM+ 1.0 元件精靈
    • ATL 動態伺服器網頁元件精靈
    • ATL OLE DB 提供者精靈
    • ATL 屬性頁精靈
    • ATL OLE DB 消費者精靈
    • MFC ODBC 消費者
    • 來自 ActiveX 控制項的 MFC 類別
    • 來自 Type Lib 的 MFC 類別。

    這些技術的範例程式碼封存於 Microsoft Learn 和 VCSamples GitHub 存放庫。

  • Visual Studio 安裝程式不再提供 Windows 8.1 軟體開發套件 (SDK)。 建議您將 C++ 專案升級到最新的 Windows SDK。 若您有 8.1 的強式相依性,可從 Windows SDK 封存加以下載。

  • 最新的 C++ 工具組無法再將 Windows XP 設為目標。 仍支援 VS 2017 級 MSVC 編譯器與程式庫的 XP 目標設定,並可透過「個別元件」安裝。

  • 我們的文件積極勸阻您對 Visual C++ 執行階段部署使用合併模組。 我們在這個版本更進一步淘汰了 MSM。 請考慮將您的 VCRuntime 集中部署從 MSM 移轉到可轉散發套件。

使用 C++ 進行行動裝置應用程式開發 (Android 與 iOS)

C++ Android 體驗現在預設為 Android SDK 25 與 Android NDK 16b。

Clang/C2 平台工具組

已移除 Clang/C2 實驗性元件。 針對具有 /permissive-/std:c++17 的完整 C++ 標準一致性使用 MSVC 工具集,或針對 Windows 使用 Clang/LLVM 工具鏈。

程式碼分析

單元測試

不再提供 Managed C++ 測試專案範本。 您可以繼續在現有的專案中使用受控 C++ 測試架構。 對於新的單元測試,請考慮使用 Visual Studio 有提供範本 (MSTest、Google Test) 或受控 C# 測試專案範本的其中一個原生測試架構。