Visual Studio (MSVC) 中 Microsoft C/C++ 編譯器的標準一致性是進行中的工作。 以下是 Visual Studio 版本的 ISO 標準 C 和 C++ 語言和程式庫一致性的摘要。 每個 C++ 編譯器和標準程式庫功能的名稱皆可連結至描述該功能的 ISO 標準 C++ 提案計畫書 (若在發行時有提供該計畫書)。 支援的資料行會列出最先出現該功能支援的 Visual Studio 版本。
如需有關一致性改善的詳細資料,請參閱 Visual Studio 2017 中的 C++ 一致性改進。 如需其他變更的清單,請參閱 Visual Studio 中 Microsoft C++ 的新功能。 如需舊版的一致性變更,請參閱 Visual C++ 變更歷程記錄和從 2003 到 2015 的 Visual C++ 新功能。 如需 C++ 小組發出的最新消息,請瀏覽 小組部落格 \(英文\)。
Note
Visual Studio 2015、2017、2019 與 2022 之間沒有二進位檔中斷性變更。 如需詳細資訊,請參閱 Visual Studio 版本之間的 C++ 二進位相容性
C++ 編譯器功能
C++ 標準程式庫功能
依產品版本排列的標準程式庫功能與 Bug 修正的更詳細清單可在 GitHub Microsoft STL wiki Changelog 頁面上取得。
如需有關進行中一致性工作的最新資訊,請參閱:
一起列出的一組計劃書顯示標準功能以及一或多個已核准的改進或延伸模組。 這些功能皆會一起實作。
C 標準程式庫功能
| Feature | Supported |
|---|---|
| C99 標準程式庫功能 | Supported |
替代拼字巨集 <iso646.h> |
VS 2015 年 |
寬字元支援 <wchar.h> 和 <wctype.h> |
VS 2015 年 |
<complex.h> 中的複雜支援 |
VS 2015 中的部分 K |
類型泛型數學函式 <tgmath.h> |
VS 2019 16.8 2104 |
其他浮點特性 <float.h> |
VS 2015 年 |
十六進位浮點數 printf 規範 %A、%a |
VS 2015 年 |
擴充整數類型 <inttypes.h>、<stdint.h> |
VS 2015 年 |
vscanf 和 <stdio.h> 中的 <wchar.h> 系列 |
VS 2015 年 |
<math.h> 中的新數學函式 |
VS 2015 年 |
處理數學程式庫錯誤狀況 (math_errhandling) |
VS 2015 年 |
浮點環境存取 <fenv.h> |
VS 2015 年 |
%lf 的 printf 轉換規範 |
VS 2015 年 |
snprintf 中函式的 <stdio.h> 系列 |
VS 2015 年 |
boolean 中的 <stdbool.h> 類型 |
VS 2015 年 |
va_copy 巨集 |
VS 2015 年 |
其他 strftime 個轉換規範 |
VS 2015 中的部分 L |
| C11 標準程式庫功能 | Supported |
對齊規範 <stdalign.h> |
VS 2019 16.8 C11、2104 |
aligned_alloc |
沒有 M |
沒有傳回規範 <stdnoreturn.h> |
VS 2019 16.8 C11、2104 |
執行緒支援 <threads.h> |
yes |
Atomic 支援 <stdatomic.h> |
experimental |
char16_t、 char32_t<uchar.h> |
Visual Studio 2019 16.8 C11 |
gets() 已移除 |
VS 2019 16.8 C11、N |
gets_s() |
Visual Studio 2019 16.8 C11 |
界限檢查介面 (*_s API) |
VS 2015 中的部分 C11、O |
fopen
"x" 選項 |
Visual Studio 2019 16.8 C11 |
| 靜態斷言 | VS 2019 16.8 C11、2104 |
quick_exit |
Visual Studio 2019 16.8 C11 |
<complex.h> 巨集 |
Visual Studio 2019 16.8 C11 |
浮點特性 <float.h> |
Visual Studio 2019 16.8 C11 |
C11 執行緒 <threads.h> |
VS 2022 17.8 C11 |
支援值
否 尚未實作。
部分 實作不完整。 如需詳細資訊,請參閱〈備註〉一節。
Visual Studio 2010 支援 VS 2010。
Visual Studio 2013 支援 VS 2013。
Visual Studio 2015 支援 VS 2015 (RTW)。
VS 2015.2 和 VS 2015.3:表示 Visual Studio 2015 Update 2 和 Visual Studio 2015 Update 3 分別支援的功能。
Visual Studio 2017 15.0 版支援 VS 2017 15.0 (RTW)。
Visual Studio 2017 15.3 版支援 VS 2017 15.3。
Visual Studio 2017 15.5 版支援 VS 2017 15.5。
Visual Studio 2017 15.7 版支援 VS 2017 15.7。
Visual Studio 2019 16.0 版支援 VS 2019 16.0 (RTW)。
Visual Studio 2019 16.1 版支援 VS 2019 16.1。
Visual Studio 2019 16.2 版支援 VS 2019 16.2。
Visual Studio 2019 16.3 版支援 VS 2019 16.3。
Visual Studio 2019 16.4 版支援 VS 2019 16.4。
Visual Studio 2019 16.5 版支援 VS 2019 16.5。
Visual Studio 2019 16.6 版支援 VS 2019 16.6。
Visual Studio 2019 16.7 版支援 VS 2019 16.7。
Visual Studio 2019 16.8 版支援 VS 2019 16.8。
Visual Studio 2019 16.9 版支援 VS 2019 16.9。
Visual Studio 2019 16.10 版支援 VS 2019 16.10。
Visual Studio 2022 17.0 版支援 VS 2022 17.0。
Visual Studio 2022 17.1 版支援 VS 2022 17.1。
Visual Studio 2022 17.2 版支援 VS 2022 17.2。
Visual Studio 2022 17.3 版 17.3 中支援的 VS 2022 17.3 。
Visual Studio 2022 17.4 版支援 VS 2022 17.4。
Visual Studio 2022 17.5 版支援 VS 2022 17.5。
MSVC 組建工具 14.50 版 在 Visual Studio 2026 18.0 (MSVC 編譯器 19.50 版) 和更新版本中支援。
Notes
A 在/std:c++14模式下,編譯器不會實作動態異常規格,並將throw()視為__declspec(nothrow)的同義詞。 在 C++17 中,P0003R5 移除了大多數動態例外規格,僅留下最後一個痕跡:標準已棄用 throw(),並要求它作為 noexcept 的同義詞。 在 /std:c++17 模式中,MSVC 現在藉由賦與 throw() 與 noexcept 相同的行為 (也就是透過終止強制執行) 來符合標準。
編譯器選項 /Zc:noexceptTypes 會要求 __declspec(nothrow) 的舊行為。 未來版本的 C++ 可能會移除 throw()。 為了協助移轉程式碼以回應標準及 Microsoft 實作中的這些變更,已在 /std:c++17 和 /permissive- 下新增例外狀況規格問題的編譯器警告。
B Visual Studio 2017 15.7 版的 /permissive- 模式可支援。 如需詳細資訊,請參閱Two-phase name lookup support comes to MSVC。
C 在 Visual Studio 2019 16.6 版和更新版本中,編譯器會透過 /Zc:preprocessor 選項完整實作標準 C99 前置處理器。 (在 Visual Studio 2017 15.8 到 16.5 版中,編譯器會透過 /experimental:preprocessor 編譯器選項支援標準 C99 前置處理器。)指定編譯器選項 /std:c11 或 /std:c17 時,此選項預設為開啟。
D 於 /std:c++14 底下受到支援,並具有可隱藏的警告 C4984。
E 實作足以支援 C++20 標準程式庫。 完整的實作需要二進位中斷性變更。
F 指定 /std:c++17 或更新編譯器選項時,會移除功能。 若要重新啟用這些功能 (以清除到新語言模式的轉換),請使用這些巨集:_HAS_AUTO_PTR_ETC、_HAS_FUNCTION_ALLOCATOR_SUPPORT、_HAS_OLD_IOSTREAMS_MEMBERS 與 _HAS_UNEXPECTED。
G C++17 的平行演算法程式庫已完成。 完成並不表示每個演算法在每個案例中都會平行處理。 最重要的演算法是平行化的。 即使實作沒有平行處理演算法,也會提供執行原則簽章。 中央內部標頭 <yvals_core.h> 包含下列「平行演算法附註」:C++ 允許實作將平行演算法實作為序列演算法的呼叫。 這項實作會平行處理數個常見的演算法呼叫,但並非全部。
下列演算法已平行處理:
-
adjacent_difference、adjacent_find、all_of、any_of、、countcount_ifequalexclusive_scanfindfind_endfind_first_offind_iffind_if_notfor_eachfor_each_ninclusive_scanis_heapis_heap_untilis_partitionedis_sortedis_sorted_untilmismatchnone_ofpartitionreduceremoveremove_ifreplacereplace_ifsearchsearch_nset_differenceset_intersectionsortstable_sorttransformtransform_exclusive_scantransform_inclusive_scantransform_reduce
這些演算法目前並未平行處理:
- 這些演算法在目標硬體上沒有顯示任何明顯的平行處理原則效能改進。 所有只複製或排列沒有分支之元素的演算法通常都受到記憶體頻寬的限制:
-
copy、copy_n、fill、fill_n、move、reverse、reverse_copyrotaterotate_copy、shift_left、、、shift_rightswap_ranges
-
- 這些演算法存在對使用者並行處理原則需求的混淆,無論如何,這些演算法很可能屬於上述類別:
-
generate、generate_n
-
- 這些演算法的有效平行處理原則可能不可行:
-
partial_sort、partial_sort_copy
-
- 這些演算法尚未評估。 程式庫可能會在未來的版本中實作平行處理原則:
-
copy_if、includes、inplace_merge、lexicographical_compare、、max_elementmergemin_elementminmax_elementnth_elementpartition_copyremove_copyremove_copy_ifreplace_copyreplace_copy_if、、set_symmetric_differenceset_unionstable_partitionuniqueunique_copy
-
H 這是全新的實作,與之前的 std::experimental 版不相容,由於符號連結支援、Bug 修正和標準必要行為的變更,因此需要此實作。 目前,<filesystem> 同時提供新的 std::filesystem 和上一個 std::experimental::filesystem。
<experimental/filesystem> 標頭只提供舊的實驗性實作。 預期在程式庫的下一個 ABI 中斷性版本中移除實驗性實作。
Jstd::byte 是由 /std:c++17 或更新版本啟用,但在某些情況下可能會與 Windows SDK 標頭發生衝突,並具有精細的退出巨集。 若要停用,請將 _HAS_STD_BYTE 定義為 0。
K MSVC 不支援 _Complex 關鍵字或原生複雜類型。 通用 CRT <complex.h> 會使用特定實作的巨集來實現相同的效果。 如需詳細資訊,請參閱 C 複雜數學支援。
L 通用 CRT 不會實作 strftimeE 和 O 替代轉換修飾元。 這些修飾元會被忽略 (例如,%Oe 的行為會和 %e 相同)。 基礎地區設定 API 不支援修飾詞。
M 通用 CRT 不會實作 C11 aligned_alloc,但確實會提供 _aligned_malloc 和 _aligned_free。 由於 Windows 作業系統不支援對齊的配置,因此不太可能實作此函式。
O 特定界限檢查函式未實作,或具有不同的簽章,或不屬於 C11 或 C17 標準的一部分。 下列函式未實作:abort_handler_s、ignore_handler_s、memset_s、set_constraint_handler_s、snprintf_s、snwprintf_s、strerrorlen_s、vsnwprintf_s。 下列函式具有不同的簽章:gmtime_s、localtime_s、qsort_s、strtok_s、vsnprintf_s、wcstok_s。 下列函式不會出現在標準中:clearerr_s、fread_s。
P Visual Studio 2019 16.10 版已新增支援。 Visual Studio 2022 17.0 版已新增對 Clang 的支援。
Q 這會移除 declare_reachable、undeclare_reachable、declare_no_pointers、undeclare_no_pointers、get_pointer_safety。 先前,這些函式沒有任何作用。
R 這是常見的來源中斷性變更。 但是,先前在執行階段具有未定義行為的程式碼現在會因編譯器錯誤而被拒絕。
S 輸入範圍配接器和 counted_iterator 會在 VS 2022 17.0 中實作。 計劃在 Visual Studio 2019 16.11 版的未來更新中納入這些變更。
T<stdatomic.h> 編譯為 C++ (/std:c++latest) 時目前會受支援。 編譯為 C 時尚不受支援 (/std:c11 和 /std:c17)
U 擴充浮點類型是可選的 C++23 功能。 在 C++23 標準化完成之前,不會實作此功能。
V 使用編譯器選項 /source-charset:utf-8 ,並將 /we4828 源文件視為 UTF-8 編碼。
14 這些 C++17 和 C++20 功能一律會啟用,就算在指定 /std:c++14 (預設值) 的情況下也一樣。 原因是因為該功能已在 /std 選項推出之前實作,或是因為條件式實作過於複雜。
17 這些功能是由 /std:c++17 或更新的編譯器選項啟用。
20 在 Visual Studio 2019 16.10 版之前的版本中,這些功能由 /std:c++latest 編譯器選項啟用。 Visual Studio 2019 16.11 版已新增 /std:c++20 編譯器選項來啟用這些功能。
20abi 由於 C++20 標準的發行後工作正在進行,<format>、<chrono> 的格式化部分 (仰賴 <format>) 以及來自 <ranges> 的範圍處理站和範圍適配器 (需要 view 概念的所有內容) 僅在 /std:c++latest 下可用。 與 WG21 達成協議後,無需再進行任何 ABI 中斷性變更,預期在 /std:c++20 下會有這些功能。 適用於範圍的其餘部分 <chrono> 和演算法在 Visual Studio 2019 16.11 版及更新版本中的 /std:c++20 編譯器選項下已啟用。
23 在 Visual Studio 2022 17.0 版與更新版本中,這些功能會由 /std:c++latest 編譯器選項啟用。
24 在 MSVC 組建工具 14.50 版和更新版本中 (首先隨附於 Visual Studio 2026 18.0 版) 中,這些功能是由編譯器選項啟用 /std:c++latest 。
C11 對 C11 和 C17 的編譯器支援需要 Visual Studio 2019 16.8 版或更高版本。 除了所述,C11 和 C17 程式庫支援需要 Windows SDK 組建 10.0.20211.0 或更高版本。 如需如何安裝 C11 和 C17 支援的詳細資訊,請參閱在 Visual Studio 中安裝 C11 和 C17 支援。
災害復原 這些功能在所有 C++ /std 編譯器選項模式中都已啟用。 C++ 標準委員會採用此變更,以作為 C++11 和所有更新版本的追溯性缺陷報表。
2104 此功能的 C11 程式庫支援需要 Windows SDK 組建 10.0.20348.0 (2104 版) 或更高版本。
另請參閱
C++ 語言參考
C++ 標準程式庫
Visual Studio 中的 C++ 一致性改善
Visual Studio 中 Microsoft C++ 的新功能
從 2003 到 2015 的 Visual C++ 變更歷程記錄
從 2003 到 2015 的 Visual C++ 新功能
C++ 小組部落格