/std
(言語の標準バージョンの指定)
指定したバージョンの C または C++ 言語標準でサポートされる C および C++ 言語機能を有効にします。
構文
/std:c++14
/std:c++17
/std:c++20
/std:c++23preview
/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++ 標準のサポート
_MSVC_LANG
プリプロセッサ マクロを使用した C++ コンパイル中に、/std
オプションが有効かどうかを検出します。 詳細については、プリプロセッサ マクロに関するページを参照してください。
重要
一部の既存のコードは __cplusplus
であるマクロ 199711L
の値に依存しているため、MSVC コンパイラは、/Zc:__cplusplus
を設定することで明示的にオプトインしない限り、このマクロの値を変更しません。
/Zc:__cplusplus
と /std
オプションを指定して、__cplusplus
を適切な値に設定します。
/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
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
C++20 標準固有の機能と動作を有効にします。
/permissive
で明示的にオーバーライドされない限り、/permissive-
によって提供される標準準拠モードを有効にします。
/std:c++23preview
プレビュー C++23 標準固有の機能と動作を有効にします。 Visual Studio 2022 バージョン 17.13 Preview 4 以降で使用できます。 プレビュー機能は変更される可能性があり、リリース間で ABI と互換性がない可能性があります。
このスイッチは、/std:c++23
スイッチが実装されると削除されます。C++23 の機能が完全に実装され、ABI が安定します。 プロジェクト プロパティ C/C++>言語 で、Preview - ISO C++ 23 Standard (/std:c++preview)を指定した場合、新しいスイッチが実装されると、/std:c++23
を意味するように自動的に変更されます。
このスイッチは、C++23 標準の一部である機能のみを有効にするという点で、/std:c++latest
とは異なります。 試験的または進行中の機能は有効になりません。
/std:c++latest
次の ISO C++ 作業ドラフトで提案されている、現在実装されているすべてのコンパイラおよび標準ライブラリ機能と、進行中の機能と試験段階の機能を有効にします。 このオプションは、Visual Studio 2015 Update 3 以降で使用できます。
MSVC コンパイラのバージョンまたは更新レベルによっては、公開されている C++ 標準の機能や、現在の C++ 作業ドラフトで提案された機能は、/std:c++latest
オプションを指定するときに完全に実装されていないか、完全に準拠していない可能性があります。 標準に最大限準拠するには、最新バージョンの Visual Studio を使用することをお勧めします。 Visual C++ のリリース バージョンごとの C++ 言語やライブラリへの準拠の概要については、Microsoft C/C++ 言語の準拠に関する記事を参照してください。
Visual Studio 2019 バージョン 16.8 以降、/std:c++latest
オプションでは、/permissive
で明示的にオーバーライドされない限り、/permissive-
によって提供される標準準拠モードが有効になりました。
サポート対象の言語機能とライブラリ機能については、Visual Studio の C++ の新機能に関する記事を参照してください。
/std:c++latest
オプションを指定しても、/experimental
スイッチでガードされている機能は有効にはなりませんが、それらを有効にする必要がある場合があります。
Note
/std:c++latest
で有効になっているコンパイラとライブラリの機能は、将来の C++ 標準に表示される場合があります。 承認されていない機能は、予告なしに破壊的変更または削除の対象となり、as-is ベースで提供されます。
C 標準のサポート
/TC
または /Tc
コンパイラ オプションを使用して、Microsoft C コンパイラを呼び出すことができます。
.c
オプションまたは /TP
オプションによってオーバーライドされない限り、ファイル拡張子が /Tp
のコードで既定で使用されます。 既定の C コンパイラ (/std:c11
と /std:c17
のいずれも指定されていないコンパイラ) では ANSI C89 を実装しますが、いくつかの Microsoft 拡張機能が含まれ、そのいくつかは ISO C99 の一部です。 C89 に対する一部の Microsoft 拡張機能は、/Za
コンパイラ オプションを使用して無効にできますが、その他は有効なままになります。 C89 に厳密に準拠するようには指定できません。 コンパイラには C99 のいくつかの必須機能が実装されていないので、C99 の準拠も指定できません。
/std:c11
ISO C11 準拠を有効にします。 Visual Studio 2019 バージョン 16.8 以降で使用できます。
/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
コンパイラ オプションを使用すると、次の機能がサポートされます。
_Pragma
restrict
-
_Noreturn
と <stdnoreturn.h> -
_Alignas
、_Alignof
、<stdalign.h> -
_Generic
と <tgmath.h> _Static_assert
ソース ファイルに .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] または [適用] を選択して変更を保存します。