/std
(言語の標準バージョンの指定)
指定したバージョンの C または C++ 言語標準でサポートされる C および C++ 言語機能を有効にします。
構文
/std:c++14
/std:c++17
/std:c++20
/std:c++latest
/std:c11
/std:c17
/std:clatest
解説
/std
オプションは Visual Studio 2017 以降で使用できます。 これらは、コードのコンパイル時に有効になる、バージョンに固有の ISO C または C++ プログラミング言語の標準機能の制御に使用します。 このオプションでは、特定のバージョンの言語標準に準拠する既存のコードを中断させてしまう可能性のある、特定の新しい言語機能とライブラリ機能を無効にできます。
Visual Studio 2017 以降のバージョンの Microsoft C++ コンパイラでは、C++ 14 (/std:c++14
) より前の C++ 標準モードはサポートされていません。 このようなサポートは予定されていません。 不完全な回避策として、より最近の標準の機能を実装していない以前の Visual C++ コンパイラ ツールセットを使用できます。 Visual Studio で以前のコンパイラ ツールセットをインストールして使う方法の詳細については、「Visual Studio でネイティブ マルチターゲットを使って古いプロジェクトをビルドする」を参照してください。
C++ 標準のサポート
C++ のコンパイル時に有効な /std
オプションは、_MSVC_LANG
プリプロセッサ マクロを使用して検出できます。 詳細については、プリプロセッサ マクロに関するページを参照してください。
重要
一部の既存のコードは 199711L
であるマクロ __cplusplus
の値に依存しているため、MSVC コンパイラは、/Zc:__cplusplus
を設定することで明示的にオプトインしない限り、このマクロの値を変更しません。 /Zc:__cplusplus
と /std
オプションを指定して、__cplusplus
を適切な値に設定します。
/std:c++14
/std:c++14
オプションを使用すると、MSVC コンパイラによって実装される C++14 標準固有の機能が有効になります。 このオプションは、C++ としてコンパイルされたコードの既定値です。 Visual Studio 2015 Update 3 以降で使用できます。
このオプションによって、言語標準の最新バージョンで変更または新規の機能に対するコンパイラと標準ライブラリのサポートが無効になります。 ただし、MSVC コンパイラの以前のリリースで既に実装されている一部の C++17 機能は無効になりません。 詳細については、「Microsoft C/C++ 言語の準拠」を参照してください。 テーブルでは、/std:c++14
を指定するときに有効になっている C++17 の機能を示します。
Visual Studio 2015 Update 2 以前で利用できる機能の依存関係を既に使用しているユーザーが /std:c++14
オプションを指定すると、破壊的な変更を避けるために、次の機能が有効なままになります。
/std:c++17
/std:c++17
オプションを使用すると、C++17 標準固有の機能と動作が有効になります。 MSVC コンパイラで実装された C++17 のすべての機能が有効になります。 このオプションを使用すると、C++17 の新機能または C++ 17 以降に変更された機能に対するコンパイラと標準ライブラリのサポートが無効になります。 具体的には、C++ 標準および作業ドラフトのバージョンで C++17 後の変更が無効になります。 C++ 標準の遡及的な不具合の更新プログラムは無効になりません。 このオプションは、Visual Studio 2017 バージョン 15.3 以降で使用できます。
MSVC コンパイラのバージョンや更新プログラムのレベルによっては、/std:c++17
のオプションを指定しても、C++17 の機能が完全に実装されなかったり、完全に準拠しなかったりする場合があります。 Visual C++ のリリース バージョンごとの C++ 言語への準拠の概要については、Microsoft C/C++ 言語の準拠に関する記事を参照してください。
/std:c++20
/std:c++20
オプションを使用すると、C++20 標準固有の機能と動作が有効になります。 Visual Studio 2019 バージョン 16.11 以降では、MSVC コンパイラによって実装される C++20 機能の完全なセットが有効になります。 Visual Studio 2022 バージョン 17.0 では、std::format
、C++20 <chrono>
の書式設定拡張機能、および範囲ファクトリと範囲アダプターは、標準の発行直後にこれらの機能が遅れて変更されたため、/std:c++20
の下の<ranges>
からサポートされていないことに注意してください。
/std:c++20
オプションを使用すると、C++20 の新機能または C++20 以降に変更された機能に対するコンパイラと標準ライブラリのサポートが無効になります。 具体的には、C++ 標準および作業ドラフトのバージョンで C++20 後の変更が無効になります。 C++ 標準の遡及的な不具合の更新プログラムは無効になりません。
/std:c++20
オプションを使用すると、/permissive
で明示的にオーバーライドされない限り、/permissive-
によって提供される標準準拠モードが有効になります。
/std:c++latest
/std:c++latest
オプションを使用すると、次のドラフト標準に対して提案されている現在実装されているコンパイラと標準ライブラリの機能のほか、進行中の機能と試験的な機能の一部が有効になります。 このオプションは、Visual Studio 2015 Update 3 以降で使用できます。
MSVC コンパイラのバージョンや更新プログラムのレベルによっては、/std:c++latest
のオプションを指定しても、C++17 や C++20 の機能、または C++23 の提案された機能が完全に実装されなかったり、完全に準拠しなかったりする場合があります。 標準に最大限準拠するには、最新バージョンの Visual Studio を使用することをお勧めします。 Visual C++ のリリース バージョンごとの C++ 言語やライブラリへの準拠の概要については、Microsoft C/C++ 言語の準拠に関する記事を参照してください。
バージョン 16.11 より前の Visual Studio 2019 のバージョンでは、C++20 のすべてのコンパイラと標準ライブラリの機能を有効にするには、/std:c++latest
が必要です。
Visual Studio 2019 バージョン 16.8 以降、/std:c++latest
オプションでは、/permissive
で明示的にオーバーライドされない限り、/permissive-
によって提供される標準準拠モードが有効になりました。
サポート対象の言語機能とライブラリ機能については、Visual Studio の C++ の新機能に関する記事を参照してください。
/std:c++latest
オプションを指定しても、/experimental
スイッチでガードされている機能は有効にはなりませんが、それらを有効にする必要がある場合があります。
Note
/std:c++latest
で有効になっているコンパイラとライブラリの機能は、将来の C++ 標準に表示される場合があります。 承認されていない機能では、破壊的変更や通知なしでの削除が起こる可能性があり、これは無保証で提供されています。
C 標準のサポート
/TC
または /Tc
コンパイラ オプションを使用して、Microsoft C コンパイラを呼び出すことができます。 /TP
オプションまたは /Tp
オプションによってオーバーライドされない限り、ファイル拡張子が .c
のコードで既定で使用されます。 既定の C コンパイラ (/std:c11
と /std:c17
のいずれも指定されていないコンパイラ) では ANSI C89 を実装しますが、いくつかの Microsoft 拡張機能が含まれ、そのいくつかは ISO C99 の一部です。 C89 に対する一部の Microsoft 拡張機能は、/Za
コンパイラ オプションを使用して無効にできますが、その他は有効なままになります。 C89 に厳密に準拠するようには指定できません。 コンパイラには C99 のいくつかの必須機能が実装されていないので、C99 の準拠も指定できません。
/std:c11
/std:c11
オプションを使用すると、ISO C11 の準拠が有効になります。 Visual Studio 2019 バージョン 16.8 以降で使用できます。
/std:c17
/std:c17
オプションを使用すると、ISO C17 の準拠が有効になります。 Visual Studio 2019 バージョン 16.8 以降で使用できます。
これらの標準をサポートするには新しいプリプロセッサが必要であるため、/std:c11
と /std:c17
コンパイラ オプションによって /Zc:preprocessor
オプションが自動的に設定されます。 C11 または C17 の従来の (レガシ) プリプロセッサを使用する必要がある場合は、/Zc:preprocessor-
コンパイラ オプションを明示的に設定する必要があります。 /Zc:preprocessor-
オプションを設定すると、予期しない動作が発生する可能性があるため、推奨されません。
Note
リリース時点および Visual Studio 2019 バージョン 16.10 まで、Visual Studio によってインストールされた Windows SDK と UCRT のライブラリでは、C11 と C17 のコードはまだサポートされていません。 更新されたバージョンの Windows SDK と UCRT が必要です。 詳細とインストール手順については、「Visual Studio に C11 および C17 サポートをインストールする」を参照してください。
/std:c11
または /std:c17
を指定すると、標準で必要とされる C11 と C17 のすべての機能が MSVC でサポートされます。 /std:c11
と /std:c17
コンパイラ オプションを使用すると、次の機能がサポートされます。
_Noreturn
と <stdnoreturn.h>_Alignas
、_Alignof
、<stdalign.h>_Generic
と <tgmath.h>
ソース ファイルに .c
ファイル拡張子がある、または /TC
か /Tc
コンパイラ オプションを指定するときに、IDE で IntelliSense の C 設定とコード ハイライトが使用されます。 現在、C の IntelliSense ではキーワード _Alignas
、_Alignof
、_Noreturn
、_Static_assert
をハイライトしますが、標準ヘッダー alignas
、alignof
、noreturn
、static_assert
で定義された同等のマクロはハイライトしません。
C17 は主に ISO C11 のバグ修正リリースであるため、MSVC の C11 のサポートには関連するすべての障害のレポートが既に含まれています。 __STDC_VERSION__
マクロを除き、C11 バージョンと C17 バージョンの違いはありません。 C11 の場合は 201112L
に、C17 の場合は 201710L
に展開されます。
コンパイラでは、ISO C11 のオプションの機能のほとんどをサポートしていません。 C11 のこれらのオプションの機能のいくつかは、アーキテクチャ関連の理由から MSVC に実装されていない C99 の必須機能でした。 __STDC_NO_VLA__
などの機能テスト マクロを使用して、個々の機能のコンパイラのサポート レベルを検出できます。 C 固有の定義済みマクロの詳細については、「定義済みマクロ」を参照してください。
準拠するマルチスレッド、アトミック、または複素数のサポートはありません。
Windows ヒープの実装により、
aligned_alloc
のサポートはありません。 代わりに、_aligned_malloc
を使用してください。障害レポート 400 のサポートは、この変更により ABI が壊れる可能性があるため、現在、
realloc
に対して実装されていません。可変長配列 (VLA) のサポートは計画していません。 VLA により、
gets
に匹敵する攻撃ベクトルが得られます。これは非推奨となっており、削除が予定されています。
/std:clatest
/std:clatest
オプションは、C++ コンパイラの /std:c++latest
スイッチと同様に動作します。 このスイッチを使用すると、次のドラフト C 標準に対して提案されている現在実装されているコンパイラと標準ライブラリの機能のほか、進行中の機能と試験的な機能の一部が有効になります。
詳細については、Microsoft C/C++ 言語準拠に関する記事の「C 標準ライブラリの機能」セクションを参照してください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳しくは、「Visual Studio で C++ コンパイラとビルド プロパティを設定する」をご覧ください。
[構成プロパティ]>[C/C++]>[言語] プロパティ ページを選択します。
[C++ 言語標準] (C の場合は [C 言語標準]) のドロップダウン コントロールからサポートする言語標準を選択し、[OK] または [適用] を選択して変更を保存します。