Visual Studio 2017 中 C++ 的新功能

Visual Studio 2017 有多個 C++ 環境的更新與修正。 我們已修正編譯程式和工具中超過 250 個 Bug 和回報的問題。 許多客戶透過 [回報問題] 和 [傳送意見反應] 底下的 [提供建議] 選項提交。 感謝您回報 Bug!

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

Visual Studio 2017 C++ 編譯程式

C++ 一致性改善

我們已在此版本中更新 C++ 編譯程式和標準連結庫,並增強對 C++11 和 C++14 功能的支援。 它也包含預期在 C++17 標準中特定功能的初步支援。 如需詳細資訊,請參閱 Visual Studio 2017 中的 C++ 一致性改善

Visual Studio 2017 15.5 版

編譯器支援 C++17 中約 75% 的新功能,包括結構化繫結、constexpr Lambda、if constexpr、內嵌變數、摺疊運算式,以及將 noexcept 新增至型別系統。 您可以在 選項下 /std:c++17 取得這些功能。 如需詳細資訊,請參閱 Visual Studio 2017 中的 C++ 一致性改善

Visual Studio 2017 15.7 版

Visual Studio 15.7 版中的 MSVC 編譯器工具組現在符合 C++ 標準。 如需詳細資訊,請參閱 宣告:MSVC 符合 C++ 標準和Microsoft C/C++ 語言一致性

Visual Studio 2017 15.8 版

編譯程式 /experimental:preprocessor 參數會啟用新的實驗性 MSVC 預處理器,最終符合所有適用的 C 和 C++ 標準。 如需詳細資訊,請參閱 MSVC 新的預處理器概觀

新的編譯器選項

  • /permissive-:啟用所有嚴格的標準一致性編譯程式選項,並停用大部分的 Microsoft 特定編譯程式延伸模組(但不包括 __declspec(dllimport),例如)。 在 Visual Studio 2017 15.5 版中,此選項預設為開啟。 /permissive-一致性模式包含兩階段名稱查閱的支援。 如需詳細資訊,請參閱 Visual Studio 2017 中的 C++ 一致性改善

  • /diagnostics:啟用診斷錯誤或警告位置的顯示三種不同的方式:只要行號、行號和數據行,或是行號和數據行,在冒犯程式代碼行底下插入號。

  • /debug:fastlink:不將所有偵錯資訊複製到 PDB 檔案,以啟用高達 30% 更快的累加連結時間(與 Visual Studio 2015)。 PDB 檔案改為指向用來建立可執行檔之物件和程式庫檔案的偵錯資訊。 請參閱 VS “15” 中的更快速 C++ 建置週期和/Debug:fastlink建議,以加速 Visual Studio 中的 C++ 建置。

  • Visual Studio 2017 允許搭配 /await使用/sdl。 我們已移除 /RTC 協同程式的限制。

Visual Studio 2017 15.3 版
  • /std:c++14/std:c++latest:這些編譯程式選項可讓您加入加入專案中特定版本的 ISO C++ 程式設計語言。 大部分新的草稿標準功能都受到選項的 /std:c++latest 防護。

  • /std:c++17 會啟用編譯程式所實作的 C++17 功能集合。 此選項會停用 C++17 之後功能的編譯程式和標準連結庫支援:在更新版本的工作草稿中變更或新功能,以及 C++ Standard 的瑕疵更新。 若要開啟這些功能,請使用 /std:c++latest

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

此版本為最佳化、程式碼產生、工具組版本控制,以及診斷方面帶來多項改善。 其中幾項值得注意的改善內容包括:

  • 改善重複的程式碼產生:支援常數整數除法的自動向量化,更容易識別 memset 模式。
  • 改善的程式代碼安全性:改善緩衝區滿溢編譯程序診斷的排放,現在 /guard:cf 會保護產生跳躍數據表的 switch 語句。
  • 版本設定:內建預處理器宏 的值_MSC_VER 現在在每次Visual C++ 工具組更新時都會進行單調更新。 如需詳細資訊,請參閱 Visual C++ Compiler Version (Visual C++ 編譯器版本)。
  • 新的工具組版面配置︰編譯器和相關建置工具在開發電腦上具有新的位置和目錄結構。 新的版面配置可並存安裝多個版本的編譯器。 如需詳細資訊,請參閱 Visual Studio 2017 中的編譯器工具版面配置 \(英文\)。
  • 改善的診斷:輸出視窗現在會顯示發生錯誤的資料行。 如需詳細資訊,請參閱 C++ compiler diagnostics improvements in VS "15" Preview 5 (VS "15" Preview 5 中的 C++ 編譯器診斷改善)。
  • 使用協同程式時,已移除實驗關鍵詞 yield (選項下 /await 提供)。 您應該更新程式碼以改用 co_yield。 如需詳細資訊,請參閱 yield 關鍵字在 VS 2017 中變成co_yield \(英文\)。
Visual Studio 2017 15.3 版

改善編譯程式中的診斷功能。 如需詳細資訊,請參閱 Visual Studio 2017 15.3.0 中的診斷改善 \(英文\)。

Visual Studio 2017 15.5 版

Visual C++ 執行時間效能會透過更佳產生的程式代碼質量持續改善。 現在您可以只重新編譯程式碼,而且您的應用程式執行速度會更快。 某些編譯器最佳化功能是全新的,例如條件式純量存放區的向量化、將 sin(x)cos(x) 呼叫合併成新的 sincos(x),以及從 SSA 最佳化工具排除多餘的指令。 其他編譯程式優化是現有功能的改善,例如:條件表達式的向量化啟發學習法、更好的循環優化,以及 float min/max codegen。 鏈接器有新的且更快速 /OPT:ICF 的實作,這可能會導致最多 9% 的鏈接時間加速,而且累加連結中有其他效能修正。 如需詳細資訊,請參閱 /OPT (Optimizations) (/OPT (最佳化)) 和 /INCREMENTAL (Link Incrementally) (/INCREMENTAL (以累加方式連結))。

Microsoft C++ 編譯程序支援 Intel 的 AVX-512。 其具有向量長度指示,可將AVX-512中的新函式帶入128位和256位寬緩存器。

選項 /Zc:noexceptTypes- 可用來還原為 C++14 版本的 noexcept 一般使用 C++17 模式。 此選項可讓您更新原始程式碼以符合 C++17,而不需要同時重寫所有 throw() 程式碼。 如需詳細資訊,請參閱動態例外狀況規格移除和 noexcept

Visual Studio 2017 15.7 版

C++ 標準程式庫

正確性改善

Visual Studio 2017 RTM (15.0 版)
  • 次要 basic_string_ITERATOR_DEBUG_LEVEL != 0 診斷的改善。 當IDL檢查在字串機械中被絆倒時,它現在會報告造成行程的特定行為。 例如,您會收到「無法取值字串反覆運算器」,而不是「字串反覆運算器」,因為它超出範圍(例如結束反覆運算器)。
  • 修正了 std::promise 移動指派運算子原本可能造成程式碼永久封鎖的問題。
  • 修正了 atomic<T*> 隱含轉換為 T* 這項編譯器錯誤。
  • pointer_traits<Ptr> 現在會正確偵測 Ptr::rebind<U>
  • 修正了 move_iterator 減法運算子缺少 const 限定詞這項問題。
  • 修正了要求 propagate_on_container_copy_assignmentpropagate_on_container_move_assignment 的具狀態使用者定義配置器會產生錯誤程式碼而不發出訊息的問題。
  • atomic<T> 現已容許多載 operator&()
  • 稍微改善不正確 bind() 呼叫的編譯器診斷。

Visual Studio 2017 RTM 中有更多標準連結庫改善。 如需完整清單,請參閱 VS 2017 RTM 中的 C++ 小組部落格項目標準連結庫修正。

Visual Studio 2017 15.3 版
  • 標準程式庫容器現在將其 max_size() 包含至 numeric_limits<difference_type>::max() 中,而不是包含在 size_typemax() 中。 此變更可確保該容器迭代器上 distance() 的結果能以 distance() 的傳回類型代表。
  • 修正了缺少特舒化 auto_ptr<void> 的問題。
  • for_each_n()如果 length 自變數不是整數型別,則先前的 、 generate_n()search_n() 演演算法無法編譯。 他們現在嘗試將非整數長度轉換成反覆運算器' difference_type
  • normal_distribution<float> 不會再於標準程式庫內對從雙精確度縮減為浮點數的情況發出警告。
  • 修正了部分 basic_string 作業,這些作業先前在檢查大小溢位上限時會使用 npos 而非 max_size()
  • condition_variable::wait_for(lock, relative_time, predicate) 如果出現假覺,將等待整個相對時間。 現在它只會等候相對時間的單一間隔。
  • 依標準的規定,future::get() 現在會使 future 無效。
  • iterator_traits<void *> 之前會嘗試形成 void&,而成為硬碟錯誤,現在則會完全成為空的結構,以允許在 "is iterator" SFINAE 條件中使用 iterator_traits
  • Clang -Wsystem-headers 報告的一些警告已修正。
  • 同時修正了 Clang -Wmicrosoft-exception-spec所報告的「宣告中的例外狀況規格不符合先前宣告」。
  • 同時已修正由 Clang 和 C1XX 所回報的 mem-initializer-list 排序錯誤。
  • 先前未排序的容器在容器本身已交換的情況下,並不會交換其 hasher 函式或述詞。 現在它們已會這麼做。
  • 許多容器交換作業現在標示了 noexcept (因為我們的標準程式庫永遠不會試圖在偵測到 non-propagate_on_container_swap non-equal-allocator 未定義行為條件時擲出例外狀況)。
  • 許多 vector<bool> 作業現在標示了 noexcept
  • 標準連結庫現在會強制執行比對配置器 value_type (在 C++17 模式中),並搭配退出逸出艙口。
  • 修正了對 basic_string 進行 self-range-insert 會擾亂字串內容的某些條件。 (注意:針對 vectors 進行 self-range-insert 仍受標準所禁止)。
  • basic_string::shrink_to_fit() 不再受配置器的 propagate_on_container_swap 影響。
  • std::decay 現在會處理可觀的函式類型,也就是 cv 限定、ref 限定或兩者的函式類型。
  • 已變更 include 指示詞以使用適當的區分大小寫和斜線,以改善可攜性​​。
  • 已修正警告 C4061 「列舉值 』enumerator' in switch of enum 'enumeration' 未明確由案例卷標處理」。此警告預設為關閉,並已修正為標準連結庫警告一般原則的例外狀況。 (標準連結庫是 /W4 乾淨的,但不會嘗試 /Wall 乾淨。許多依預設的警告異常嘈雜,並不適合定期使用。
  • 改善 std::list 偵錯檢查。 List 迭代器現在會檢查 operator->(),且 list::unique() 現在會將迭代器標示為無效。
  • 修正了 tuple 中的 uses-allocator 中繼程式設計。
Visual Studio 2017 15.5 版
  • std::partition 現在會呼叫述 N 詞時間而不是 N + 1 時間,因為標準需要。
  • 嘗試避免 15.3 版中的魔術靜態在 15.5 版中修復。
  • std::atomic<T> 不再要求 T 必須預設為可建構的。
  • 啟用反覆運算器偵錯時,採用對數時間的堆積演算法會有不同的行為。 它們不再執行線性時間判斷提示,指出輸入實際上是堆積。
  • __declspec(allocator) 現在只會為 C1XX 而防護,以防止 Clang 不了解此 declspec 而發出警告。
  • basic_string::npos 現在可作為編譯時間常數。
  • std::allocator在 C++17 模式中,現在正確處理過度對齊類型的配置,也就是說,除非 已/Zc:alignedNew-停用 ,否則其對齊方式大於max_align_t的類型。 例如,具有 16 位元組或 32 位元組對齊的物件向量現在會正確對齊 SSE 和 AVX 指令。

一致性改善

  • 我們新增了 <any>、<string_view>、apply()make_from_tuple()
  • 新增了 <optional>、<variant>、shared_ptr::weak_type 和 <cstdalign>。
  • min(initializer_list)max(initializer_list)minmax(initializer_list),及 min_element()max_element()minmax_element() 中可使用 C++ 14 constexpr

如需詳細資訊,請參閱 Microsoft C/C++ 語言一致性

Visual Studio 2017 15.3 版
  • 已實作其他數個 C++17 功能。 如需詳細資訊,請參閱 Microsoft C++ 語言一致性數據表
  • 已實作 P0602R0「Variant 和 Optional 應隨意地散佈 Copy/Move」。
  • 標準程式庫現已正式容許透過 /GR- 選項停用動態 RTTI。 和 原本都需要 dynamic_cast,因此標準連結庫現在會將它們標示為 =delete 底下/GR-rethrow_if_nested()dynamic_pointer_cast()
  • 即使透過 /GR-停用動態 RTTI 時,仍可使用 形式的 typeid(SomeType) 「靜態 RTTI」,並提供數個標準連結庫元件。 標準連結庫現在也支援透過 /D_HAS_STATIC_RTTI=0停用此功能。 此旗標也會停用 std::functionstd::anytarget()target_type() 成員函式,及 std::shared_ptrstd::weak_ptrget_deleter() friend 成員函式。
  • 標準程式庫現在會無條件使用 C++14 constexpr,而不使用已定義條件的巨集。
  • 標準程式庫現在會於內部使用別名範本。
  • 標準程式庫現在會於內部使用 nullptr,而不使用 nullptr_t{}。 (NULL 的內部使用已消除。0 as-null 的內部使用量正在逐漸清除。
  • 標準程式庫現在會於內部使用 std::move(),而非誤用 std::forward()
  • static_assert(false, "message") 已變更為 #error message。 此變更會改善編譯器診斷,因為 #error 會使編譯立刻停止。
  • 標準程式庫已不再將函式標示為 __declspec(dllimport)。 新式的連結器技術已不再需要這麼做。
  • 已將 SFINAE 擷取至預設範本引數,相較於傳回類型和函式引數類型,這將會減少雜亂的情形。
  • 隨機進行偵<>錯檢查現在會使用標準連結庫的一般機制,而不是內部函_Rng_abort()式,其呼叫fputs()stderr。 此函式的實作會保留為二進位相容性。 我們將在標準連結庫的下一個二進位不相容版本中將其移除。
Visual Studio 2017 15.5 版
  • 已根據 C++17 標準新增、取代或移除數個標準連結庫功能。 如需詳細資訊,請參閱 Visual Studio 中的 C++ 一致性改善
  • 下列平行演算法的實驗性支援:
    • all_of
    • any_of
    • for_each
    • for_each_n
    • none_of
    • reduce
    • replace
    • replace_if
    • sort
  • 會新增下列平行演算法的簽章,但目前不會平行化。 分析在只移動或排列元素的演算法平行處理方面沒有好處:
    • copy
    • copy_n
    • fill
    • fill_n
    • move
    • reverse
    • reverse_copy
    • rotate
    • rotate_copy
    • swap_ranges
Visual Studio 2017 15.6 版
  • <memory_resource>
  • 程式庫基本概念 V1
  • 刪除 polymorphic_allocator 指派
  • 改善類別範本引數推斷
Visual Studio 2017 15.7 版
  • 對平行演算法的支援不再為實驗性
  • 的新實作 <filesystem>
  • 基礎字串轉換 (部分)
  • std::launder()
  • std::byte
  • hypot(x,y,z)
  • 避免不必要的 Decay
  • 數學特殊函式
  • constexpr char_traits
  • 標準程式庫的推算指南

如需詳細資訊,請參閱 Microsoft C/C++ 語言一致性

效能和輸送量修正

  • 使 basic_string::find(char) 多載只呼叫 traits::find 一次。 先前已為長度為 1 的字串將其作為一般字串搜尋實作。
  • basic_string::operator== 現在會先檢查字串的大小再比較字串的內容。
  • 移除了 basic_string 中的控制項結合程度,因為編譯器最佳化工具很難加以分析。 對所有短字串呼叫 reserve 都不會執行任何動作,但仍有成本。
  • std::vector 已針對正確性和效能進行徹底改革:插入和 Emplace 作業期間的別名現在已正確處理為標準,標準透過 move_if_noexcept() 和其他邏輯要求時,現在會提供強例外狀況保證,而插入和 emplace 會執行較少的項目作業。
  • C++ 標準程式庫現在會避免為 null 假想指標取值。
  • 改善了 weak_ptr::lock() 效能。
  • 為了增加編譯器輸送量,C++ 標準程式庫標頭現在會避免包含非必要編譯器內建的宣告。
  • 改善了 std::stringstd::wstring 移動建構函式的效能,改善幅度超過三倍。
Visual Studio 2017 15.3 版
  • 處理與 noexcept的互動,這可防止將 std::atomic 實作內嵌到使用結構化例外狀況處理 (SEH) 的函式中。
  • 標準程式庫的內部 _Deallocate() 函式已變更為較小的程式碼,使其適合內嵌至更多位置。
  • std::try_lock() 已從使用遞迴改為使用套件展開。
  • 改善了 std::lock() 鎖死迴避演算法,從原本對所有鎖定重複執行 try_lock() ,改為使用 lock() 作業。
  • system_category::message() 中可進行具名傳回值最佳化。
  • conjunctiondisjunction 現在會具現化 N + 1 類型,而不是 2N + 2 類型。
  • std::function 不會再對每個已清除類型的可呼叫項目將配置器支援機制具現化,如此可在會傳遞許多相異 Lambda 到 std::function 的程式中,改善輸送量並減少 .obj 大小。
  • allocator_traits<std::allocator> 包含手動內嵌的 std::allocator 作業,以減少只透過 allocator_traitsstd::allocator 互動之程式碼 (也就是大部分程式碼) 中的程式碼大小。
  • C++11 最小配置器介面現已由標準程式庫直接呼叫 allocator_traits 來處理,而非將配置器包裝在內部類別 _Wrap_alloc 中。 此變更會減少為支援配置器所產生的程式碼大小、改善最佳化工具在某些情況下對標準程式庫容器進行判斷的能力,並提供更佳的偵錯體驗 (如同您現在會在偵錯工具中看見您的配置器類型,而非 _Wrap_alloc<your_allocator_type>)。
  • 已移除自定義 allocator::reference的中繼程式,不允許其配置器進行自定義。 (配置器可以使容器使用自訂的指標,但不能使用自訂的參考)。
  • 編譯器前端被教導在範圍架構的 for 迴圈中解除偵錯迭代器的包裝,以改善偵錯組建的效能。
  • shrink_to_fit()reserve()basic_string 內部縮小路徑已不再位於重新配置作業的路徑中,以減少所有變動成員的程式碼大小。
  • basic_string 的內部成長路徑已不再位於 shrink_to_fit() 的路徑中。
  • 現已將 basic_string 變動作業納入非配置的快速路徑和配置的慢速路徑函式中,讓一般的無重新配置案例更容易內嵌至呼叫者。
  • basic_string變動作業現在會以慣用狀態建構重新配置緩衝區,而不是就地重設大小。 例如,字串開頭的插入現在會將內容完全移動一次。 它會向下移動或移至新配置的緩衝區。 重新配置案例中不會再移動兩次,先移至新配置的緩衝區,然後再向下移動。
  • 在 <string> 中呼叫 C 標準程式庫的作業現在會快取 errno 位址,以免與 TLS 間重複互動。
  • 簡化了 is_pointer 實作。
  • 以函式為基礎的運算式 SFINAE 已變更為以 structvoid_t 為基礎。
  • 標準程式庫演算法現在會避免會後續累加的迭代器。
  • 已修正在 64 位元系統上使用 32 位元配置器時會出現的截斷警告。
  • 透過在情況允許時重複使用緩衝區,std::vector 移動指派現在在非 POCMA non-equal-allocator 案例中變得更有效率。
Visual Studio 2017 15.5 版
  • basic_string<char16_t> 現在會與 basic_string<wchar_t> 納入相同的 memcmpmemcpy 及相似的最佳化。
  • 我們在 Visual Studio 2015 Update 3 中進行的「避免複製函式」顯示了最佳化工具有一項限制會導致函式指標無法內嵌,而這項問題已獲得解決,從而恢復 lower_bound(iter, iter, function pointer) 的效能。
  • 現在會先將迭代器解除包裝再檢查順序,讓迭代器偵錯對 includesset_differenceset_symmetric_differenceset_union 輸入執行的順序驗證得以減輕額外負荷。
  • std::inplace_merge 現在會跳過已就位的項目。
  • 建構 std::random_device 不會再建構並終結 std::string
  • std::equalstd::partition 具有跳躍執行緒最佳化傳遞,可免去迭代器比較。
  • 當傳遞指標以簡單複製Tstd::reverse,它現在會分派至手寫向量化實作。
  • 已指示 std::fillstd::equalstd::lexicographical_compare 如何分派至 std::bytegsl::byte (及其他 char 一類的列舉和列舉類別) 的 memsetmemcmpstd::copy 使用 is_trivially_copyable 分派,因此不需任何變更。
  • 標準程式庫不再包含空的大括弧解構函式,其唯一的行為是使類型成為 non-trivially-destructible。

其他程式庫

開放原始碼程式庫支援

Vcpkg 是一種開放原始碼命令列工具,可大幅簡化在 Visual Studio 中取得和建置開放原始碼 C++ 靜態程式庫和 DLLS 的程序。 如需詳細資訊,請參閱 vcpkg

CPPRest SDK 2.9.0

Visual Studio 2017 15.5 版

CPPRestSDK 是適用於 C++ 的跨平臺 Web API,會更新為 2.9.0 版。 如需詳細資訊,請參閱 CppRestSDK 2.9.0 is available on GitHub(GitHub 上可用的 CppRestSDK 2.9.0)。

ATL

Visual Studio 2017 15.5 版
  • 另一組 name-lookup 一致性修正
  • 現有的移動建構函式和移動指派運算子現在已正確標示為非擲回
  • 取消隱藏和 atlstr.h 中區域靜態安全執行緒初始化有關的有效警告 C4640
  • 使用ATL建置 DLL時,XP 工具組中會自動關閉本機靜態的線程安全初始化。 現在不是 如果您不想要安全線程初始化,您可以在 Project 設定中新增 /Zc:threadSafeInit-

Visual C++ 執行階段

  • 「控制流程防護」符號的新標頭 ‘cfguard.h’。

Visual Studio 2017 C++ IDE

  • C++ 原生專案的組態變更效能現已提升,而 C++/CLI 專案的組態變更效能則更佳。 第一次啟用解決方案組態時,速度較快,而且此解決方案組態的所有後續啟用幾乎都是瞬間的。
Visual Studio 2017 15.3 版
  • 已重寫數個專案和程式碼精靈的簽章對話方塊樣式。
  • [加入類別] 現在會直接啟動 [加入類別精靈]。 這裡先前的所有其他項目現在都可在 [新增>專案] 下取得。
  • Win32 專案現在在 [新增專案] 對話方塊的 [Windows Desktop] 類別下。
  • Windows 主控台傳統型應用程式範本現在會建立專案,而不顯示精靈。 相同類別下有新的 [Windows Desktop 精靈],其顯示的選項與舊版 [Win32 主控台應用程式精靈] 相同。
Visual Studio 2017 15.5 版

使用 IntelliSense 引擎進行重構和程式碼瀏覽的數項 C++ 作業執行速度更快。 下列數值是根據含有 3500 個專案的 Visual Studio Chromium 方案而來:

功能 效能改善
重新命名 5.3 倍
變更簽章 4.5 倍
尋找所有參考 4.7 倍

C++ 現在支援以 Ctrl+按一下 [移至定義],如此可輕鬆使用滑鼠瀏覽至定義。 Productivity Power Tools 套件的 Structure Visualizer 現在預設也會隨附於產品。

IntelliSense

  • 現在預設使用新的 SQLite 型資料庫引擎。 新的引擎可加速資料庫作業,例如 [移至定義 ] 和 [尋找所有參考]。 其可大幅改善初始解決方案剖析時間。 設定已移至 [工具 > 選項 > 文本編輯器 > C/C++ > 進階]。 (以前在...C/C++ > 實驗性。)

  • 我們已改善未使用先行編譯標頭之專案和檔案的 IntelliSense 效能 - 針對目前檔案中的標頭建立自動先行編譯標頭。

  • 我們也為錯誤清單中的 IntelliSense 錯誤新增了錯誤篩選及說明。 現在按一下錯誤資料行即可進行篩選。 此外,按一下特定錯誤或按 F1 會啟動線上搜尋錯誤訊息。

    Error List.

    Error List Filtered.

  • 新增了依種類篩選成員清單項目的功能。

    Member List Filtering.

  • 新增了實驗性的預測性 IntelliSense 功能,提供成員清單中出現項目的內容相關篩選。 如需詳細資訊,請參閱 C++ IntelliSense 改善 - 預測性 IntelliSense 和篩選 \(英文\)。

  • [尋找所有參考] (Shift+F12) 現可協助您輕鬆搜索,即使在複雜的程式碼基底亦然。 它提供進階分組、篩選、排序、在結果內搜尋和顏色標示 (適用於某些語言),因此您可以清楚了解您的參考。 針對 C++,新的 UI 包含要從變數讀取或寫入變數的相關資訊。

  • 點對箭號 IntelliSense 功能已從實驗移至進階,現在預設為啟用。 編輯器功能 [展開範圍 ] 和 [展開優先順序 ] 已從實驗移至進階。

  • 根據預設,現已可使用實驗性重構功能 [變更簽章] 和 [擷取函式]

  • 已新增 C++ 專案實驗性的 [加快專案載入] 功能。 C++ 專案會在您下次開啟時更快載入,之後將以更快速度載入!

  • 其中有部分功能通用於其他語言,部分功能則是 C++ 的特定功能。 如需有關這些新功能的詳細資訊,請參閱宣布 Visual Studio "15" Preview 5

Visual Studio 2017 15.7 版

使用開啟資料夾的非 MSBuild 專案

Visual Studio 2017 引進 [ 開啟資料夾 ] 功能。 它可讓您在包含原始程式碼的資料夾中撰寫程式代碼、建置和偵錯,而不需要建立任何解決方案或專案。 現在開始使用 Visual Studio 會比較簡單,即使您的專案不是 MSBuild 型專案也一樣。 開啟資料夾 可讓您存取功能強大的程式代碼瞭解、編輯、建置和偵錯功能。 它們與 Visual Studio 已針對 MSBuild 專案提供的相同專案。 如需詳細資訊,請參閱 Open Folder projects for C++ (適用於 C++ 的開啟資料夾專案)。

  • [開啟資料夾] 體驗的改良。 您可以透過下列 .json 檔案自訂體驗:
    • CppProperties.json,用以自訂 IntelliSense 及瀏覽體驗。
    • Tasks.json,用以自訂建置步驟。
    • Launch.json,用以自訂偵錯經驗。
Visual Studio 2017 15.3 版
  • 已改善針對替代編譯器和建置環境 (例如 MinGW 和 Cygwin) 的支援。 如需詳細資訊,請參閱搭配 Visual C++ 和「開啟資料夾」使用 MinGW 和 Cygwin \(英文\)。
  • 新增了在 CppProperties.json 和 CMakeSettings.json 中定義全域和組態專用環境變數的支援。 這些環境變數可供 launch.vs.json 中定義的偵錯組態和 tasks.vs.json 中的工作取用。 如需詳細資訊,請參閱 Customizing your Environment with Visual C++ and Open Folder (使用 Visual C++ 和開啟資料夾來自訂您的環境)。
  • 已改善針對 CMake Ninja 產生器的支援,包括能夠輕鬆以 64 位元平台作為目標的能力。

透過開啟資料夾的 CMake 支援

Visual Studio 2017 支援使用 CMake 專案,而不需要轉換為 MSBuild 專案檔 (.vcxproj)。 如需詳細資訊,請參閱 Visual Studio 中的 CMake 專案。 使用 Open Folder 開啟 CMake 專案會自動設定 C++ 編輯、建置和偵錯的環境。

  • 無須在根資料夾中建立 CppProperties.json 檔案,C++ IntelliSense 即可運作。 我們新增了一個新的下拉式清單,讓使用者可以輕鬆地在 CMake 和 CppProperties.json 檔案所提供的設定之間切換。

  • 透過與 CMakeLists.txt 檔案位於相同資料夾的 CMakeSettings.json 檔案,支援進一步設定。

    CMake Open Folder.

Visual Studio 2017 15.3 版
  • 為 CMake Ninja 產生器新增了支援。
Visual Studio 2017 15.4 版
  • 為匯入現有 CMake 快取新增了支援。
Visual Studio 2017 15.5 版

Windows 桌面開發

我們現在提供安裝原始 C++ 工作負載時更細微的安裝體驗。 我們新增了可選取的元件,讓您只安裝所需的工具。 安裝程式 UI 中所列元件的指示安裝大小不正確,並低估總大小。

若要在 C++ 桌面工作負載中成功建立 Win32 專案,您必須安裝工具組和 Windows SDK。 安裝建議 (選取) 的元件 VC++ 2017 v141 工具組 (x86、x64)Windows 10 SDK (10.0.nnnnn) 可確保其正常運作。 如果未安裝必要的工具,將不會成功建立專案,而且精靈會停止回應。

Visual Studio 2017 15.5 版

Visual Studio Build Tools (先前以獨立產品形式提供) 現在以工作負載形式包含在 Visual Studio 安裝程式中。 此工作負載只會安裝建置 C++ 專案所需的工具,而不會安裝 Visual Studio IDE。 v140 和 v141 工具組都包含在內。 v141 工具組包含 Visual Studio 2017 15.5 版的最新改善功能。 如需詳細資訊,請參閱 Visual Studio Build Tools now include the VS2017 and VS2015 MSVC Toolsets (Visual Studio 建置工具現在包含 VS2017 和 VS2015 MSVC 工具組)。

使用 C++ 進行 Linux 開發

熱門的 Visual C++ for Linux Development 擴充功能現已納入 Visual Studio 中。 這個安裝提供您開發在 Linux 環境上執行的 C++ 應用程式,並進行偵錯所需的一切。

Visual Studio 2017 15.2 版

跨平臺程式代碼共享和類型視覺效果已改善。 如需詳細資訊,請參閱針對跨平台程式碼共用和類型視覺效果的 Linux C++ 改善 \(英文\)。

Visual Studio 2017 15.5 版
  • Linux 工作負載新增了 rsync 的支援, 以替代 sftp ,以便將檔案同步處理至遠端 Linux 機器。
  • 新增以 ARM 為目標的交互編譯支援。 若要在安裝中啟用這項支援,請選擇 [使用 C++ 進行 Linux 開發] 工作負載,並選取 [內嵌和 IoT 開發] 的選項。 此選項會將 ARM GCC 交互編譯工具和 Make 新增至您的安裝。 如需詳細資訊,請參閱 ARM GCC Cross Compilation in Visual Studio (Visual Studio 中的 ARM GCC 交互編譯)。
  • 新增對 CMake 的支援。 您現在可以使用現有的 CMake 程式碼基底,而不必將它轉換成 Visual Studio 專案。 如需詳細資訊,請參閱設定 Linux CMake 專案
  • 新增對執行遠端工作的支援。 此功能可讓您在 Visual Studio 連線 ion Manager 中定義的遠端系統上執行任何命令。 遠端工作也會提供將檔案複製到遠端系統的功能。 如需詳細資訊,請參閱設定 Linux CMake 專案
Visual Studio 2017 15.7 版

使用 C++ 進行遊戲開發

使用 C++ 的完整功能建置由 DirectX 或 Cocos2d 技術提供的專業遊戲。

使用適用於 Android 和 iOS 的 C++ 進行行動裝置開發

您現在能夠使用可以 Android 及 iOS 為目標的 Visual Studio 建立行動應用程式並對其偵錯。

通用 Windows App

C++ 以通用 Windows app 工作負載的選用元件形式提供。 目前,您必須手動升級 C++ 專案。 您可以在 Visual Studio 2017 中開啟 v140 目標 通用 Windows 平台 專案。 不過,如果您沒有安裝 Visual Studio 2015,則必須在專案屬性頁中選取 v141 平臺工具組。

通用 Windows 平台 (UWP) 上 C++ 的新選項

您現在有新的選項可用來撰寫和封裝 通用 Windows 平台 和 Windows 市集的 C++ 應用程式:傳統型橋接器 基礎結構可讓您封裝現有的傳統型應用程式或 COM 物件,以透過 Windows 市集進行部署。 或者,透過側載透過現有的通道進行部署。 Windows 10 中的新功能可讓您以各種方式將 UWP 功能新增至傳統型應用程式。 如需詳細資訊,請參閱傳統型橋接器

Visual Studio 2017 15.5 版

新增了 [Windows 應用程式封裝專案] 專案範本,可大幅簡化使用傳統型橋接器封裝傳統型應用程式的工作。 該範本位於 [檔案] | [開新檔案] | [專案] | [已安裝] | [Visual C++] | [通用 Windows 平台] 底下。 如需詳細資訊,請參閱使用 Visual Studio 封裝應用程式 (傳統型橋接器)

撰寫新的程式碼時,您現在可以使用 C++/WinRT,它是一種標準 C++ 語言推演,適用於僅在標頭檔中實作的 Windows 執行階段。 它可讓您使用任何符合標準的 C++ 編譯程式來取用和撰寫 Windows 執行階段 API。 C++/WinRT 設計成將現代 Windows API 的第一級存取提供給 C++ 開發人員。 如需詳細資訊,請參閱 C++/WinRT

從 Windows SDK Insider Preview 組建 17025 開始,Windows SDK 中包含 C++/WinRT。 如需詳細資訊,請參閱 C++/WinRT is now included the Windows SDK (C++/WinRT 現在隨附於 Windows SDK)。

Clang/C2 平臺工具組

隨附於Visual Studio 2017的Clang/C2 工具組現在支持 /bigobj 參數,這對建置大型項目至關重要。 它也包含編譯程式前端和後端中的數個重要錯誤修正。

C++ 程式碼分析

用於強制 C++ Core Guidelines 的 C++ Core Checkers 現已隨 Visual Studio 散發。 在專案屬性頁的 [程序代碼分析延伸模組 ] 頁面中啟用檢查程式。 然後,當您執行程式代碼分析時,會包含延伸模組。 如需詳細資訊,請參閱使用 C++ 核心指南檢查工具

Screenshot of the Property Pages dialog box showing Configuration Properties > Code Analysis > General selected and a number of Core Checks listed in teh Run this rule set section.

Visual Studio 2017 15.3 版
  • 新增了資源管理相關規則的支援。
Visual Studio 2017 15.5 版
  • 新的 C++ Core Guidelines 檢查範圍涵蓋智慧型指標正確性、全域初始設定式是否正確使用,並標幟 goto 等建構的使用和不正確的轉換。

  • 您在 15.3 中可能發現的某些警告編號已於 15.5 中不再提供。 這些警告已取代為更明確的檢查。

Visual Studio 2017 15.6 版
Visual Studio 2017 15.7 版

Visual Studio 2017 中的單元測試

Visual Studio 2017 15.5 版

Google Test Adapter 和 Boost.Test Adapter 現在可作為使用 C++ 進行桌面開發工作負載的元件。 它們已與 測試總管整合。 CMake 專案已新增 CTest 支援(使用 Open Folder),不過尚未提供與 測試總 管的完整整合。 如需詳細資訊,請參閱撰寫 C/C++ 的單元測試

Visual Studio 2017 15.6 版
  • 已新增動態連結 Boost.Test 庫支援的支援。
  • 項目 Boost.Test 範本現在可在 IDE 中使用。

如需詳細資訊,請參閱 Boost.Test 單元測試:動態連結庫支援和新項目範本

Visual Studio 2017 15.7 版

已新增對 C++ 單元測試專案的 CodeLens 支援。 如需詳細資訊,請參閱 Announcing CodeLens for C++ Unit Testing (宣佈適用於 C++ 單元測試的 CodeLens)。

Visual Studio 圖形診斷

Visual Studio 圖形診斷工具:您可以使用它們來記錄和分析 Direct3D 應用程式中的轉譯和效能問題。 在本機在 Windows 電腦上、Windows 裝置模擬器或遠端電腦或裝置上執行的應用程式上使用它們。

  • 頂點和幾何著色器的輸入與輸出: 檢視頂點著色器和幾何著色器的輸入和輸出功能是其中一個最要求的功能。 工具現在支援它。 在 [管線階段] 檢視中選取 VS 或 GS 階段,開始檢查下表中的輸入和輸出。

    Input/Output for shaders.

  • 在物件表格中搜尋和篩選︰提供快速且輕鬆的方式來尋找所尋找的資源。

    Screenshot of the Object Table section with the Type drop-down and Search text box called out.

  • 資源歷程記錄:這個新檢視提供簡化的方式,來查看在轉譯所擷取畫面格期間使用之資源的整個修改歷程記錄。 若要叫用任何資源的歷程記錄,請按下任何資源超連結旁的時鐘圖示。

    Resource history.

    它會顯示新的 [資源歷程記錄 ] 工具視窗,並填入資源的變更歷程記錄。

    Resource history change.

    您可以擷取已啟用完整呼叫堆疊擷取的畫面格。 這可讓您快速推斷每個變更事件的內容,並在Visual Studio專案中檢查它。 在 [圖形診斷] 底下的 [Visual Studio 工具>選項] 對話框中設定完整堆棧擷取選項。

  • API 統計資料︰檢視畫面格中 API 使用方式的高階摘要。 探索您可能完全沒有意識到自己正在撥打的通話,或您經常撥打的電話,是很方便的。 此視窗可透過 Visual Studio圖形分析器中的檢視 > API統計數據 取得。

    API stats.

  • 記憶體統計數據: 檢視驅動程式為框架中建立的資源配置多少記憶體。 此視窗可透過在 Visual Studio 圖形分析器檢視>記憶體統計數據來取得。 若要將數據複製到 CSV 檔案以在電子錶格中檢視,請以滑鼠右鍵按兩下並選擇 [ 全部複製]。

    Memory stats.

  • 畫面格驗證:新的錯誤和警告清單提供簡單的方法,以根據 Direct3D 偵錯層所偵測到的潛在問題來巡覽事件清單。 按兩下 Visual Studio 圖形分析器中的 [檢視 > 框架驗證 ] 以開啟視窗。 然後按一下 [執行驗證] 開始分析。 根據畫面格的複雜性而定,這可能需要幾分鐘的時間才能完成。

    Frame validation.

  • D3D12 的畫面格分析: 使用畫面格分析,透過導向的「假設」實驗來分析繪製呼叫效能。 切換至 [畫面格分析] 索引標籤,然後執行分析以檢視報表。

    Frame analysis.

  • GPU 使用量改善:您可以透過Visual Studio GPU使用量分析工具搭配 GPUView 或 Windows 效能分析器 (WPA) 工具來取得開放式追蹤,以取得更詳細的分析。 如果您已安裝 Windows Performance Toolkit,則有兩個超連結:一個用於 WPA,另一個用於 GPUView,位於會話概觀的右下角。

    GPU usage.

    透過此連結開啟的追蹤支援同步的 VS 和 GPUView 時間軸縮放和行動流覽。 VS 中的複選框會控制是否啟用同步處理。

    GPUView.