Visual Studio (MSVC) 中 Microsoft C/C++ 編譯器的標準一致性是進行中的工作。 以下是 Visual Studio 版本對 ISO 標準 C 與 C++ 編譯器及標準函式庫相容性的摘要。 每個功能名稱都會有連結到描述該功能的 ISO 標準提案文件,若該文件在發布時可用。 支援的資料行會列出最先出現該功能支援的 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 編譯器的功能
| Feature | Supported |
|---|---|
| C99 核心語言特性 | 部分支援C99 |
| 識別碼中的通用字元名稱 | 是的 |
| 提高翻譯限制 | 是的 |
// 留言 |
是的 |
restrict 指標 |
是的 |
_Bool |
是的 |
long long |
是的 |
_Complex
/
_Imaginary 關鍵字 |
部分 K |
| 彈性陣列成員 | 是的 |
| 可變長度陣列(VLA)類型 | 沒有 C99 |
| 可變修改(VM)類型(例如指向 VLA 的指標) | 沒有 C99 |
| 指定初始設定式 | 是的 |
聚合初始化中的非恆定初始化器(例如 int a[2] = { init_func(), init_func() };) |
是的 |
| 冪等 CVR 限定子 | 是的 |
| 列舉者列表中的尾隨逗號 | 是的 |
| 十六進位浮點常數 | 是的 |
| 複合字面值 | 是的 |
| 帶符號整數除法的截斷 | 是的 |
在main()函式中的隱含return 0; |
是的 |
| 宣告與陳述以混合順序排列 | 是的 |
| for 迴圈中的初始化陳述 | 是的 |
| 內嵌函式 | 是的 |
預定義變數 __func__ |
是的 |
CVR 限定符與函式宣告中的 [] 內的 static |
MSVC 19.52 |
| 可變參數巨集 | 是的 |
| _Pragma 預處理器一元運算子 | VS 2019 16.7 |
| 浮點數求值的標準編譯指示 | 沒有 W |
| C11 核心語言特性 | Yes |
泛型表達式 _Generic |
VS 2019 16.7 |
靜態斷言 _Static_assert |
VS 2019 16.8 |
| 匿名結構與聯合體 | 是的 |
| 無回傳函數 | 是的 |
| 可選的 C11 核心語言功能 | |
| Threads | 是的 |
| 原子操作 | VS 2022 17.5 部分 X |
| VLA | No |
| 複雜數學 | 部分 K |
| C17 核心語言特色 | 是的C17 |
| C23 核心語言特性 | 部分 |
| 屬性 | VS 2022 17.7 |
[[nodiscard]]
含有訊息 |
VS 2022 17.7 |
[[maybe_unused]]
附有標籤 |
VS 2022 17.7 |
[[deprecated]] |
VS 2022 17.7 |
[[fallthrough]] |
VS 2022 17.7 |
[[noreturn]] |
VS 2022 17.7 |
[[unsequenced]] 和 [[reproducible]] |
VS 2022 17.7 Y |
| 允許重複屬性 | VS 2022 17.7 |
static_assert 未附訊息 |
是的 |
| IEEE 754 十進位浮點類型 | No |
| IEEE 754 交換格式與擴充型別 | No |
u8 字元常數 |
No |
| 移除未宣告原型的函式定義 | No |
| 函數定義中的無名參數 | No |
| 宣告前的標籤與區塊結束 | 部分 標籤 |
| 二進位整數常數 | VS 2015 14.0 |
__has_c_attribute 在預處理器條件句中 |
VS 2022 17.7 |
| 數字分隔符號 | VS 2015 14.0 |
#elifdef 和 #elifndef |
VS 2022 17.10 |
字串文字的 u8 型別變更 |
No |
#warning |
MSVC 19.50 |
位元精確整數類型 (_BitInt) |
No |
| 位元精確整數常數的後綴 | No |
__has_include 在預處理器條件句中 |
VS 2017 15.3 |
| 使用 Unicode 標準附錄 31 的識別語法 | MSVC 19.50 |
| 移除無原型函式宣告 | No |
| 空大括號初始化器 | VS 2022 17.9 |
typeof 以及typeof_unqual |
VS 2022 17.9 |
| 關鍵字新拼法 | 部分 VS 2022 17.6:static_assert VS 2022 17.7:thread_local |
true 以及 false 一流的語言功能 |
No |
| 放寬變異參數列表的要求 | No |
物件定義中的型別推論 (auto) |
No |
#embed |
No |
constexpr 物件 |
No |
| 改良後的一般列舉 | No |
| 具有固定底層類型的枚舉 | No |
__VA_OPT__ |
VS 2022 17.9 |
| 複合常值的儲存類別指定符 | No |
nullptr |
No |
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。
VS 2019 16.0 在 Visual Studio 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。
VS 2022 17.0 支援於 Visual Studio 2022 版本 17.0 中。
Visual Studio 2022 17.1 版支援 VS 2022 17.1。
Visual Studio 2022 17.2 版支援 VS 2022 17.2。
VS 2022 17.3 支援於 Visual Studio 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、count、count_if、equal、exclusive_scan、find、find_end、find_first_of、find_if、find_if_not、for_each、for_each_n、inclusive_scan、is_heap、is_heap_until、is_partitioned、is_sorted、is_sorted_until、mismatch、none_of、partition、reduce、remove、remove_if、replace、replace_if、search、search_n、set_difference、set_intersection、sort、stable_sort、transform、transform_exclusive_scan、transform_inclusive_scan、transform_reduce
這些演算法目前並未平行處理:
- 這些演算法在目標硬體上沒有顯示任何明顯的平行處理原則效能改進。 所有只複製或排列沒有分支之元素的演算法通常都受到記憶體頻寬的限制:
-
copy、copy_n、fill、fill_n、move、reverse、reverse_copy、rotate、rotate_copy、shift_left、shift_right、swap_ranges
-
- 這些演算法存在對使用者並行處理原則需求的混淆,無論如何,這些演算法很可能屬於上述類別:
-
generate、generate_n
-
- 這些演算法的有效平行處理原則可能不可行:
-
partial_sort、partial_sort_copy
-
- 這些演算法尚未評估。 程式庫可能會在未來的版本中實作平行處理原則:
-
copy_if、includes、inplace_merge、lexicographical_compare、max_element、merge、min_element、minmax_element、nth_element、partition_copy、remove_copy、remove_copy_if、replace_copy、replace_copy_if、set_symmetric_difference、set_union、stable_partition、unique、unique_copy
-
H 這是一個全新的實作,與之前的 std::experimental 版本不相容。此實作是因為符號鏈接支援、錯誤修正和標準要求行為的改變而變得必要。
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 編碼。
W 編譯器透過非標準的編譯指示 fp_contract、fenv_access 和 float_control 來控制浮點行為。
X C11 原子技術在 /experimental:c11atomics 下受支援。
Y :C23 屬性 [[unsequenced]] 和 [[reproducible]] 在文法中被接受,但優化時不會使用它們。
標籤 編譯器支援宣告上的標籤,但不支援在複合陳述式結尾加上標籤。
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 。
C99 大多數在 C11 中被設為可選的 C99 功能,編譯器不支援或僅部分支援。
C11 對 C11 和 C17 的編譯器支援需要 Visual Studio 2019 16.8 版或更高版本。 除了所述,C11 和 C17 程式庫支援需要 Windows SDK 組建 10.0.20211.0 或更高版本。 如需如何安裝 C11 和 C17 支援的詳細資訊,請參閱在 Visual Studio 中安裝 C11 和 C17 支援。
DR 這些功能在所有 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++ 小組部落格