Visual Studio バージョン別の Microsoft C/C++ 言語準拠
Visual Studio での Microsoft C/C++ コンパイラ (MSVC) の標準への準拠は、進行中の作業です。 ここでは、Visual Studio のバージョン別に、ISO 標準の C/C++ 言語およびライブラリの準拠についてまとめます。 C++ コンパイラと標準ライブラリの各機能の名前は、その機能を説明する ISO 標準の C++ 提案書にリンクしています (発行時に利用可能な場合)。 サポート状況列には、その機能が最初にサポートされた Visual Studio のバージョンが記載されています。
準拠の強化の詳細については、「Visual Studio の C++ 準拠の強化」を参照してください。 その他の変更の一覧については、「Visual Studio の Visual C++ の新機能」をご覧ください。 以前のバージョンにおける準拠の変更点については、Visual C++ の変更履歴に関するページと「Visual C++ 2003 ~ 2015 の新機能」をご覧ください。 C++ チームからの最新情報については、C++ チームのブログを参照してください。
Note
Visual Studio 2015、2017、2019、2022 の間では、バイナリの破壊的変更はありません。 詳細については、「Visual Studio のバージョン間の C++ バイナリ互換性」をご覧ください
C++ コンパイラ機能
C++ 標準ライブラリの機能
製品バージョン別の標準ライブラリの機能とバグ修正の詳細な一覧については、GitHub Microsoft STL wiki の変更ログに関するページを参照してください。
複数の提案書がまとめて記載されている箇所は、承認された 1 つ以上の改善または拡張機能と併せた標準機能を示しています。 これらの機能はまとめて実装されます。
C 標準ライブラリの機能
機能 | サポートされています |
---|---|
C99 標準ライブラリの機能 | サポートされています |
その他のスペル マクロ <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 |
16 進数の float printf 指定子 %A 、%a |
VS 2015 |
長整数型 <inttypes.h> 、<stdint.h> |
VS 2015 |
vscanf および <wchar.h> での <stdio.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 標準ライブラリの機能 | サポートされています |
アラインメント指定子 <stdalign.h> |
VS 2019 16.8 C11、2104 |
aligned_alloc |
いいえ M |
戻り値指定子 <stdnoreturn.h> がありません |
VS 2019 16.8 C11、2104 |
スレッド処理のサポート <threads.h> |
はい |
アトミック サポート <stdatomic.h> |
試験段階 |
char16_t 、 char32_t <uchar.h> |
VS 2019 16.8 C11 |
gets() の削除 |
VS 2019 16.8 C11、N |
gets_s() |
VS 2019 16.8 C11 |
境界チェック インターフェイス (*_s API) |
VS 2015 で一部 C11、O |
fopen "x" オプション |
VS 2019 16.8 C11 |
静的アサーション | VS 2019 16.8 C11、2104 |
quick_exit |
VS 2019 16.8 C11 |
<complex.h> マクロ |
VS 2019 16.8 C11 |
浮動小数点特性 <float.h> |
VS 2019 16.8 C11 |
C11 スレッド <threads.h> |
VS 2022 17.8 C11 |
サポート状況の値
いいえ まだ実装されていません。
一部 実装が一部のみであるという意味です。 詳細については、「メモ」セクションを参照してください。
VS 2010 Visual Studio 2010 でサポートされています。
VS 2013 Visual Studio 2013 でサポートされています。
VS 2015 Visual Studio 2015 (RTW) でサポートされています。
VS 2015.2 と VS 2015.3 はそれぞれ、Visual Studio 2015 更新プログラム 2 と Visual Studio 2015 更新プログラム 3 でサポートされている機能を示します。
VS 2017 15.0 Visual Studio 2017 バージョン 15.0 (RTW) でサポートされています。
VS 2017 15.3 Visual Studio 2017 バージョン 15.3 でサポートされています。
VS 2017 15.5 Visual Studio 2017 バージョン 15.5 でサポートされています。
VS 2017 15.7 Visual Studio 2017 バージョン 15.7 でサポートされています。
VS 2019 16.0 Visual Studio 2019 バージョン 16.0 (RTW) でサポートされています。
VS 2019 16.1 Visual Studio 2019 バージョン 16.1 でサポートされています。
VS 2019 16.2 Visual Studio 2019 バージョン 16.2 でサポートされています。
VS 2019 16.3 Visual Studio 2019 バージョン 16.3 でサポートされています。
VS 2019 16.4 Visual Studio 2019 バージョン 16.4 でサポートされています。
VS 2019 16.5 Visual Studio 2019 バージョン 16.5 でサポートされています。
VS 2019 16.6 Visual Studio 2019 バージョン 16.6 でサポートされています。
VS 2019 16.7 Visual Studio 2019 バージョン 16.7 でサポートされています。
VS 2019 16.8 Visual Studio 2019 バージョン 16.8 でサポートされています。
VS 2019 16.9 Visual Studio 2019 バージョン 16.9 でサポートされています。
VS 2019 16.10 Visual Studio 2019 バージョン 16.10 でサポートされています。
VS 2022 17.0 Visual Studio 2022 バージョン 17.0 でサポートされています。
VS 2022 17.1 Visual Studio 2022 バージョン 17.1 でサポートされています。
VS 2022 17.2 Visual Studio 2022 バージョン 17.2 でサポートされています。
VS 2022 17.3 Visual Studio 2022 バージョン 17.3 でサポートされています。
VS 2022 17.4 Visual Studio 2022 バージョン 17.4 でサポートされています。
VS 2022 17.5 Visual Studio 2022 バージョン 17.5 でサポートされています。
メモ
A /std:c++14
モードには、動的例外指定は実装されておらず、throw()
は引き続き __declspec(nothrow)
のシノニムとして扱われています。 C++ 17 では、1 つの形跡を除き、動的例外指定が P0003R5 でほとんど削除されています。throw()
は非推奨となり、noexcept
のシノニムとして動作する必要があります。 /std:c++17
モードの MSVC は、throw()
に noexcept
と同じ動作 (つまり、終了を使った強制) を与えることによって、標準に準拠するようになりました。
コンパイラ オプション /Zc:noexceptTypes
を指定すると、以前の __declspec(nothrow)
の動作が要求されます。 throw()
は、将来のバージョンの C++ では削除される可能性があります。 標準および 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++ allows an implementation to implement parallel algorithms as calls to the serial algorithms」(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
バージョンとは対応していません。これは、symlink サポート、バグ修正、標準で要求される動作への変更で必要です。 現在、<filesystem>
では、新しい std::filesystem
と以前の std::experimental::filesystem
の両方が提供されています。 <experimental/filesystem>
ヘッダーでは、古い実験的な実装のみが提供されています。 ライブラリの次の ABI の重大なリリースで、この実験的な実装が削除されることを想定してください。
J std::byte
は /std:c++17
以降により有効になっていますが、Windows SDK のヘッダーと競合することがあるため、細かいオプトアウト マクロがあります。 これを無効にするには、_HAS_STD_BYTE
を 0
として定義します。
K MSVC は、_Complex
キーワードまたはネイティブ複合型をサポートしていません。 ユニバーサル CRT <complex.h>
では、 実装固有のマクロを使用して同じ効果を得ます。 詳細については、「C の複雑な数値演算のサポート」を参照してください。
L ユニバーサル CRT は、 strftime
E
および O
代替変換修飾子を実装していません。 これらの修飾子は無視されます (たとえば、%Oe
は %e
と同じように動作します)。 修飾子は、基になるロケール API ではサポートされていません。
M Universal CRT は C11 aligned_alloc
を実装していませんが、_aligned_malloc
と _aligned_free
を提供します。 Windows オペレーティング システムでは割り当てを調整しないため、この機能は実装される可能性が少ないです。
N 宣言は削除されますが、関数のエクスポートは旧バージョンとの互換性のために残されています。
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 で追加されました。 Clang のサポートは、Visual Studio 2022 バージョン 17.0 で追加されました。
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
) としてコンパイルする場合はまだサポートされていません。
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
からしか使用できません。 これ以上 ABI に重大な変更が必要ないことを WG21 と合意した後、これらの機能が /std:c++20
で使用できるようになると想定してください。 <chrono>
の残りの部分と範囲に該当するアルゴリズムは、Visual Studio 2019 バージョン 16.11 およびそれ以降のバージョンの /std:c++20
のコンパイラ オプションで使用できるようになります。
23 Visual Studio 2022 バージョン 17.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 サポートをインストールする」を参照してください。
DR これらの機能はすべての C++ /std
コンパイラ オプション モードで有効になります。 C++ 標準化委員会では、C++11 以降のすべてのバージョンに対する遡及的な障害レポートとして、この変更が採用されています。
2104 この機能での C11 ライブラリのサポートには Windows SDK ビルド 10.0.20348.0 (バージョン 2104) 以降が必要です。
関連項目
C++ 言語リファレンス
C++ 標準ライブラリ
Visual Studio の C++ 準拠の強化
Visual Studio の Visual C++ の新機能
Visual C++ 2003 から 2015 の変更履歴
2003 から 2015 の Visual C++ の新機能
C++ チーム ブログ