定義済みマクロ

Microsoft C/C++ コンパイラ (MSVC) では、言語 (C または C++)、コンパイル ターゲット、および選択されたコンパイラ オプションに応じて、特定のプリプロセッサ マクロが事前定義されます。

MSVC では、ANSI/ISO C99、C11、C17 標準および ISO C++14、C++17、C++20 標準で必要とされる定義済みプリプロセッサ マクロがサポートされています。 実装では、さらにいくつかの Microsoft 固有のプリプロセッサ マクロもサポートされています。 一部のマクロは、特定のビルド環境またはコンパイラ オプションに対してのみ定義されます。 特に明記されていない限り、マクロは /D コンパイラ オプションの引数として指定されているかのように、翻訳単位全体で定義されます。 マクロは定義されている場合、プリプロセッサによってコンパイルの前に、指定された値に展開されます。 定義済みマクロは引数を取らず、再定義することはできません。

標準の定義済み識別子

コンパイラでは、ISO C99 および ISO C++11 によって指定されているこの定義済み識別子がサポートされています。

  • __func__ 関数ローカルの char静的コンテンツ配列としての、外側の関数の非修飾かつ非装飾の名前。

    void example(){
        printf("%s\n", __func__);
    } // prints "example"
    

標準の定義済みマクロ

コンパイラでは、ISO C99、C11、C17 および ISO C++17 標準によって指定されているこれらの定義済みマクロがサポートされています。

  • __cplusplus 翻訳単位が C++ としてコンパイルされるときに、整数リテラル値として定義されます。 それ以外の場合は、定義されません。

  • __DATE__ 現在のソース ファイルのコンパイル日付。 日付は Mmm dd yyyy 形式の固定長の文字列リテラルです。 月の名前 Mmm は、C ランタイム ライブラリ (CRT) asctime 関数によって生成される省略形の月名と同じものです。 日付 dd の最初の文字は、値が 10 未満の場合は空白になります。 このマクロは常に定義されます。

  • __FILE__ 現在のソース ファイルの名前。 __FILE__ は文字の文字列リテラルに展開されます。 ファイルへの完全パスが表示されるようにするには、 /FC (診断時のソース コード ファイルの完全パス) を使用します。 このマクロは常に定義されます。

  • __LINE__ 現在のソース ファイルの整数の行番号として定義されます。 __LINE__ マクロの値は、#line ディレクティブを使用して変更できます。 __LINE__ の値の整数型は、コンテキストによって異なる場合があります。 このマクロは常に定義されます。

  • __STDC__ C としてコンパイルされるときに /Za コンパイラ オプションが指定されている場合にのみ、1 として定義されます。 Visual Studio 2022 バージョン 17.2 以降は、C としてコンパイルされるときに /std:c11 または /std:c17 コンパイラ オプションが指定されている場合にも、1 として定義されます。 それ以外の場合は、定義されません。

  • __STDC_HOSTED__ 実装が必要な標準ライブラリ全体をサポートするホストされた実装である場合、1 として定義されます。 それ以外の場合は、0 として定義されます。

  • __STDC_NO_ATOMICS__ 実装で任意の標準アトミックがサポートされない場合、1 として定義されます。 MSVC 実装では、C としてコンパイルされ、 /std の C11 か C17 オプションが指定されているとき、1 として定義されます。

  • __STDC_NO_COMPLEX__ 実装で任意の標準複素数がサポートされない場合、1 として定義されます。 MSVC 実装では、C としてコンパイルされ、 /std の C11 か C17 オプションが指定されているとき、1 として定義されます。

  • __STDC_NO_THREADS__ 実装で任意の標準スレッドがサポートされない場合、1 として定義されます。 MSVC 実装では、C としてコンパイルされ、 /std の C11 か C17 オプションが指定されているとき、1 として定義されます。

  • __STDC_NO_VLA__ 実装で任意の標準可変長配列がサポートされない場合、1 として定義されます。 MSVC 実装では、C としてコンパイルされ、 /std の C11 か C17 オプションが指定されているとき、1 として定義されます。

  • __STDC_VERSION__ C としてコンパイルされ、 /std の C11 か C17 オプションが指定されているとき、定義されます。 /std:c11 の場合は 201112L に、 /std:c17 の場合は 201710L に展開されます。

  • __STDCPP_DEFAULT_NEW_ALIGNMENT__以降を指定すると/std:c17、このマクロは、alignment-unaware operator newの呼び出しによって保証されるアラインメントの値を持つリテラルに拡張size_tされます。 より大きな線形は、線形に対応するオーバーロードに渡されます。次に例を示 operator new(std::size_t, std::align_val_t)します。 詳細については、「(C++17 のオーバーアライン割り当て)」を参照してください/Zc:alignedNew

  • __STDCPP_THREADS__ プログラムが複数の実行スレッドを持つことができ、C++ としてコンパイルされる場合にのみ、1 として定義されます。 それ以外の場合は、定義されません。

  • __TIME__ 前処理された翻訳単位の翻訳時刻。 時刻は hh: mm: ss 形式の文字の文字列リテラルで、CRT asctime 関数から返される時刻と同じものです。 このマクロは常に定義されます。

Microsoft 固有の定義済みマクロ

MSVC では、次の定義済みマクロがサポートされます。

  • __ATOM__/favor:ATOM コンパイラ オプションが設定され、コンパイラ ターゲットが x86 または x64 の場合、1 として定義されます。 それ以外の場合は、定義されません。

  • __AVX__/arch:AVX/arch:AVX2、または /arch:AVX512 コンパイラ オプションが設定され、コンパイラ ターゲットが x86 または x64 の場合、1 として定義されます。 それ以外の場合は、定義されません。

  • __AVX2__/arch:AVX2 または /arch:AVX512 コンパイラ オプションが設定され、コンパイラ ターゲットが x86 または x64 の場合、1 として定義されます。 それ以外の場合は、定義されません。

  • __AVX512BW__/arch:AVX512 コンパイラ オプションが設定され、コンパイラ ターゲットが x86 または x64 の場合、1 として定義されます。 それ以外の場合は、定義されません。

  • __AVX512CD__/arch:AVX512 コンパイラ オプションが設定され、コンパイラ ターゲットが x86 または x64 の場合、1 として定義されます。 それ以外の場合は、定義されません。

  • __AVX512DQ__/arch:AVX512 コンパイラ オプションが設定され、コンパイラ ターゲットが x86 または x64 の場合、1 として定義されます。 それ以外の場合は、定義されません。

  • __AVX512F__/arch:AVX512 コンパイラ オプションが設定され、コンパイラ ターゲットが x86 または x64 の場合、1 として定義されます。 それ以外の場合は、定義されません。

  • __AVX512VL__/arch:AVX512 コンパイラ オプションが設定され、コンパイラ ターゲットが x86 または x64 の場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _CHAR_UNSIGNED 既定の char 型が unsigned の場合、1 として定義されます。 この値は、 /J (既定の char 型が unsigned) コンパイラ オプションが設定されている場合に定義されます。 それ以外の場合は、定義されません。

  • __CLR_VER アプリのコンパイルに使用される共通言語ランタイム (CLR) のバージョンを表す整数リテラルとして定義されます。 値は Mmmbbbbb の形式でエンコードされます。M はランタイムのメジャー バージョン、mm はランタイムのマイナー バージョン、bbbbb はビルド番号です。 __CLR_VER は、 /clr コンパイラ オプションが設定されている場合に定義されます。 それ以外の場合は、定義されません。

    // clr_ver.cpp
    // compile with: /clr
    using namespace System;
    int main() {
       Console::WriteLine(__CLR_VER);
    }
    
  • _CONTROL_FLOW_GUARD/guard:cf (制御フロー ガードの有効化) コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • __COUNTER__ 0 から始まる整数リテラルに展開されます。 ソース ファイルで使用されるか、ソース ファイルのヘッダーに追加されるたびに、値が 1 ずつ増えます。 __COUNTER__ にはプリコンパイル済みヘッダーを使用するときのその状態が記憶されます。 このマクロは常に定義されます。

    この例では、__COUNTER__ を使用して、同じ型の 3 つの異なるオブジェクトに一意の識別子を割り当てます。 exampleClass コンストラクターは、パラメーターとして整数を受け取ります。 main で、アプリケーションは一意の識別子パラメーターとして __COUNTER__ を使用して、exampleClass 型の 3 つのオブジェクトを宣言します。

    // macro__COUNTER__.cpp
    // Demonstration of __COUNTER__, assigns unique identifiers to
    // different objects of the same type.
    // Compile by using: cl /EHsc /W4 macro__COUNTER__.cpp
    #include <stdio.h>
    
    class exampleClass {
        int m_nID;
    public:
        // initialize object with a read-only unique ID
        exampleClass(int nID) : m_nID(nID) {}
        int GetID(void) { return m_nID; }
    };
    
    int main()
    {
        // __COUNTER__ is initially defined as 0
        exampleClass e1(__COUNTER__);
    
        // On the second reference, __COUNTER__ is now defined as 1
        exampleClass e2(__COUNTER__);
    
        // __COUNTER__ is now defined as 2
        exampleClass e3(__COUNTER__);
    
        printf("e1 ID: %i\n", e1.GetID());
        printf("e2 ID: %i\n", e2.GetID());
        printf("e3 ID: %i\n", e3.GetID());
    
        // Output
        // ------------------------------
        // e1 ID: 0
        // e2 ID: 1
        // e3 ID: 2
    
        return 0;
    }
    
  • __cplusplus_cli C++ としてコンパイルされ、 /clr コンパイラ オプションが設定されている場合、整数リテラル値 200406 として定義されます。 それ以外の場合は、定義されません。 __cplusplus_cliは定義される場合、翻訳単位全体で有効になります。

    // cplusplus_cli.cpp
    // compile by using /clr
    #include "stdio.h"
    int main() {
       #ifdef __cplusplus_cli
          printf("%d\n", __cplusplus_cli);
       #else
          printf("not defined\n");
       #endif
    }
    
  • __cplusplus_winrt C++ としてコンパイルされ、/ZW (Windows ランタイムのコンパイル) コンパイラ オプションが設定されている場合、整数リテラル値 201009 として定義されます。 それ以外の場合は、定義されません。

  • _CPPRTTI/GR (ランタイム型情報の有効化) コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _CPPUNWIND/GX (例外処理の有効化)/clr (共通言語ランタイムのコンパイル)、または /EH (例外処理モデル) コンパイラ オプションが 1 つ以上設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _DEBUG/LDd/MDd、または /MTd コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _DLL/MD または /MDd (マルチスレッド DLL) コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • __FUNCDNAME__ 外側の関数の装飾名を含む文字列リテラルとして定義されます。 このマクロは関数内でのみ定義されます。 /EP または /P コンパイラ オプションを使用する場合、__FUNCDNAME__ マクロは展開されません。

    この例では、__FUNCDNAME____FUNCSIG__、および __FUNCTION__ マクロを使用して関数の情報を表示します。

    // Demonstrates functionality of __FUNCTION__, __FUNCDNAME__, and __FUNCSIG__ macros
    void exampleFunction()
    {
        printf("Function name: %s\n", __FUNCTION__);
        printf("Decorated function name: %s\n", __FUNCDNAME__);
        printf("Function signature: %s\n", __FUNCSIG__);
    
        // Sample Output
        // -------------------------------------------------
        // Function name: exampleFunction
        // Decorated function name: ?exampleFunction@@YAXXZ
        // Function signature: void __cdecl exampleFunction(void)
    }
    
  • __FUNCSIG__ 外側の関数のシグネチャを含む文字列リテラルとして定義されます。 このマクロは関数内でのみ定義されます。 /EP または /P コンパイラ オプションを使用する場合、__FUNCSIG__ マクロは展開されません。 64 ビット ターゲット用にコンパイルされた場合、既定の呼び出し規則は __cdecl です。 使用例については、__FUNCDNAME__ マクロを参照してください。

  • __FUNCTION__ 外側の関数の非装飾名を含む文字列リテラルとして定義されます。 このマクロは関数内でのみ定義されます。 /EP または /P コンパイラ オプションを使用する場合、__FUNCTION__ マクロは展開されません。 使用例については、__FUNCDNAME__ マクロを参照してください。

  • _INTEGRAL_MAX_BITS 整数リテラル値 64 として定義されます。これは、非ベクター整数型の最大サイズ (ビット単位) です。 このマクロは常に定義されます。

    // integral_max_bits.cpp
    #include <stdio.h>
    int main() {
        printf("%d\n", _INTEGRAL_MAX_BITS);
    }
    
  • __INTELLISENSE__ IntelliSense コンパイラから Visual Studio IDE に渡されるときに、1 として定義されます。 それ以外の場合は、定義されません。 このマクロを使用して、IntelliSense コンパイラで認識されないコードを保護したり、ビルドと IntelliSense コンパイラを切り替えるために使用したりできます。 詳細については、「Troubleshooting Tips for IntelliSense Slowness」 (IntelliSense のパフォーマンス低下のトラブルシューティングのヒント) を参照してください。

  • _ISO_VOLATILE/volatile:iso コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _KERNEL_MODE/kernel (カーネル モード バイナリの作成) コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _M_AMD64 x64 プロセッサまたは ARM64EC を対象とするコンパイルの整数リテラル値 100 として定義されます。 それ以外の場合は、定義されません。

  • _M_ARM ARM プロセッサをターゲットとするコンパイルの場合、整数リテラル値 7 として定義されます。 ARM64、ARM64EC、およびその他のターゲットでは未定義です。

  • _M_ARM_ARMV7VE ARM プロセッサをターゲットとするコンパイルに対して /arch:ARMv7VE コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _M_ARM_FP ARM プロセッサ ターゲットに対してどの /arch コンパイラ オプションが設定されたかを示す整数リテラル値として定義されます。 それ以外の場合は、定義されません。

    • /arch ARM オプションが指定されていない場合は 30 から 39 の範囲の値。ARM の既定のアーキテクチャ (VFPv3) が設定されていることを示します。

    • /arch:VFPv4 が設定されている場合は、40 から 49 の範囲の値。

    • 詳細については、 /arch (ARM) を参照してください。

  • _M_ARM64 ARM64 を対象とするコンパイルでは 1 として定義されます。 それ以外の場合は、定義されません。

  • _M_ARM64EC ARM64EC を対象とするコンパイルでは 1 として定義されます。 それ以外の場合は、定義されません。

  • _M_CEE/clr (共通言語ランタイムのコンパイル) コンパイラ オプションのいずれかが設定されている場合、001 として定義されます。 それ以外の場合は、定義されません。

  • _M_CEE_PURE Visual Studio 2015 以降、非推奨となりました。 /clr:pure コンパイラ オプションが設定されている場合、001 として定義されます。 それ以外の場合は、定義されません。

  • _M_CEE_SAFE Visual Studio 2015 以降、非推奨となりました。 /clr:safe コンパイラ オプションが設定されている場合、001 として定義されます。 それ以外の場合は、定義されません。

  • _M_FP_CONTRACT Visual Studio 2022 から使用可能。 /fp:contract または /fp:fast コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _M_FP_EXCEPT/fp:except または /fp:strict コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _M_FP_FAST/fp:fast コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _M_FP_PRECISE/fp:precise コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _M_FP_STRICT/fp:strict コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _M_IX86 x86 プロセッサをターゲットとするコンパイルの場合、整数リテラル値 600 として定義されます。 このマクロは、x64 または ARM コンパイル ターゲットに対しては定義されません。

  • _M_IX86_FP 設定された /arch コンパイラ オプション、または既定値を示す整数リテラル値として定義されます。 このマクロは、コンパイル ターゲットが x86 プロセッサの場合に常に定義されます。 それ以外の場合は、定義されません。 定義される場合、値は次のとおりです。

    • /arch:IA32 コンパイラ オプションが設定されている場合、0。

    • /arch:SSE コンパイラ オプションが設定されている場合、1。

    • /arch:SSE2/arch:AVX/arch:AVX2、または /arch:AVX512 コンパイラ オプションが設定されている場合、2。 この値は、/arch コンパイラ オプションが指定されていない場合の既定値です。 /arch:AVX が指定されている場合、マクロ __AVX__ も定義されます。 /arch:AVX2 が指定されている場合、__AVX____AVX2__ の両方も定義されます。 /arch:AVX512 が指定されている場合、__AVX____AVX2____AVX512BW____AVX512CD____AVX512DQ____AVX512F____AVX512VL__ も定義されます。

    • 詳細については、 /arch (x86) を参照してください。

  • _M_X64 x64 プロセッサまたは ARM64EC を対象とするコンパイルの整数リテラル値 100 として定義されます。 それ以外の場合は、定義されません。

  • _MANAGED/clr コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _MSC_BUILD コンパイラのバージョン番号のリビジョン番号要素を含む整数リテラルとして定義されます。 リビジョン番号は、ピリオド区切りのバージョン番号の 4 番目の要素です。 たとえば、Microsoft C/C++ コンパイラのバージョン番号が 15.00.20706.01 の場合、_MSC_BUILD マクロは 1 に評価されます。 このマクロは常に定義されます。

  • _MSC_EXTENSIONS 既定でオンの /Ze (言語拡張機能の有効化) コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _MSC_FULL_VER コンパイラのバージョン番号のメジャー、マイナー、およびビルド番号要素をエンコードする整数リテラルとして定義されます。 メジャー番号はピリオド区切りのバージョン番号の最初の要素、マイナー番号は 2 番目の要素、ビルド番号は 3 番目の要素です。 たとえば、Microsoft C/C++ コンパイラのバージョン番号が 15.00.20706.01 の場合、_MSC_FULL_VER マクロは 150020706 に評価されます。 コマンド ラインで「cl /?」と入力すると、コンパイラのバージョン番号が表示されます。 このマクロは常に定義されます。

  • _MSC_VER コンパイラのバージョン番号のメジャーおよびマイナー番号要素をエンコードする整数リテラルとして定義されます。 メジャー番号はピリオド区切りのバージョン番号の最初の要素、マイナー番号は 2 番目の要素です。 たとえば、Microsoft C/C++ コンパイラのバージョン番号が 17.00.51106.1 の場合、_MSC_VER マクロは 1700 に評価されます。 コマンド ラインで「cl /?」と入力すると、コンパイラのバージョン番号が表示されます。 このマクロは常に定義されます。

    Visual Studio のバージョン _MSC_VER
    Visual Studio 6.0 1200
    Visual Studio .NET 2002 (7.0) 1300
    Visual Studio .NET 2003 (7.1) 1310
    Visual Studio 2005 (8.0) 1400
    Visual Studio 2008 (9.0) 1500
    Visual Studio 2010 (10.0) 1600
    Visual Studio 2012 (11.0) 1,700
    Visual Studio 2013 (12.0) 1800
    Visual Studio 2015 (14.0) 1900
    Visual Studio 2017 RTW (15.0) 1910
    Visual Studio 2017 バージョン 15.3 1911
    Visual Studio 2017 バージョン 15.5 1912
    Visual Studio 2017 バージョン 15.6 1913
    Visual Studio 2017 バージョン 15.7 1914
    Visual Studio 2017 バージョン 15.8 1915
    Visual Studio 2017 バージョン 15.9 1916
    Visual Studio 2019 RTW (16.0) 1920
    Visual Studio 2019 バージョン 16.1 1921
    Visual Studio 2019 バージョン 16.2 1922
    Visual Studio 2019 バージョン 16.3 1923
    Visual Studio 2019 バージョン 16.4 1924
    Visual Studio 2019 バージョン 16.5 1925
    Visual Studio 2019 バージョン 16.6 1926
    Visual Studio 2019 バージョン 16.7 1927
    Visual Studio 2019 バージョン 16.8、16.9 1928
    Visual Studio 2019 バージョン 16.10、16.11 1929
    Visual Studio 2022 RTW (17.0) 1930
    Visual Studio 2022 バージョン 17.1 1931
    Visual Studio 2022 バージョン 17.2 1932

    特定のバージョン以降の Visual Studio でコンパイラのリリースまたは更新プログラムをテストするには、>= 演算子を使用します。 条件付きディレクティブで使用して、その既知のバージョンに対して _MSC_VER を比較することができます。 比較対象として相互に排他的な複数のバージョンがある場合は、バージョン番号の降順で比較を行います。 たとえば、このコードでは Visual Studio 2017 以降でリリースされたコンパイラがチェックされます。 次に、Visual Studio 2015 以降でリリースされたコンパイラがチェックされます。 その後、Visual Studio 2015 より前にリリースされたすべてのコンパイラがチェックされます。

    #if _MSC_VER >= 1910
    // . . .
    #elif _MSC_VER >= 1900
    // . . .
    #else
    // . . .
    #endif
    

    メジャー番号とマイナー数値を共有するコンパイラのバージョンをテストするには、_MSC_FULL_VER でメジャー番号、マイナー番号、およびビルド番号を使用して比較します。 Visual Studio 2019 バージョン 16.9 のコンパイラでは、_MSC_FULL_VER の値が 192829500 以上になります。 Visual Studio 2019 バージョン 16.11 のコンパイラでは、_MSC_FULL_VER の値が 192930100 以上になります。

    詳細については、Microsoft C++ チームのブログ「Visual C++ Compiler Version」 (Visual C++ コンパイラのバージョン) を参照してください。

  • _MSVC_LANG コンパイラのターゲットである C++ 言語標準を指定する整数リテラルとして定義されます。 これは、C++ としてコンパイルされたコードでのみ設定されます。 マクロは、既定では、または /std:c++14 コンパイラ オプションが指定されている場合は、整数リテラル値 201402L です。 /std:c++17 コンパイラ オプションが指定されている場合は、マクロは 201703L に設定されます。 /std:c++20 コンパイラ オプションが指定されている場合は、マクロは 202002L に設定されます。 /std:c++latest オプションが指定されている場合は、より大きい、未指定の値に設定されます。 それ以外の場合は、マクロは定義されません。 _MSVC_LANG マクロと /std (言語の標準バージョンの指定) コンパイラ オプションは、Visual Studio 2015 Update 3 以降で使用できます。

  • __MSVC_RUNTIME_CHECKS/RTC コンパイラ オプションのいずれかが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _MSVC_TRADITIONAL:

    • Visual Studio 2017 バージョン15.8 以降で利用可能:プリプロセッサ準拠モード /experimental:preprocessor コンパイラ オプションが設定されている場合、0 として定義されます。 既定では、または /experimental:preprocessor- コンパイラ オプションが設定されている場合は、1 として定義されます。これは、従来のプリプロセッサが使用されていることを示します。
    • Visual Studio 2019 バージョン16.5 以降で利用可能:プリプロセッサ準拠モード /Zc:preprocessor コンパイラ オプションが設定されている場合、0 として定義されます。 既定では、または /Zc:preprocessor- コンパイラ オプションが設定されている場合は、1 として定義されます。これは、従来のプリプロセッサが使用されていることを示します (基本的に、/Zc:preprocessor は非推奨の /experimental:preprocessor を置き換えます)。
    #if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL
    // Logic using the traditional preprocessor
    #else
    // Logic using cross-platform compatible preprocessor
    #endif
    
  • _MT/MD/MDd (マルチスレッド DLL)/MT/MTd (マルチスレッド) のいずれかが指定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _NATIVE_WCHAR_T_DEFINED/Zc:wchar_t コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _OPENMP/openmp (OpenMP 2.0 サポートの有効化) コンパイラ オプションが設定されている場合、整数リテラル 200203 として定義されます。 この値は、MSVC によって実装される OpenMP 仕様の日付を表します。 それ以外の場合は、定義されません。

    // _OPENMP_dir.cpp
    // compile with: /openmp
    #include <stdio.h>
    int main() {
        printf("%d\n", _OPENMP);
    }
    
  • _PREFAST_/analyze コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • __SANITIZE_ADDRESS__ Visual Studio 2019 バージョン 16.9 以降で使用可能: /fsanitize=address コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • __TIMESTAMP__ 現在のソース ファイルが最後に変更された日時を格納する文字列リテラルとして定義されます。CRT asctime 関数から返される省略形の固定長の形式です (例: Fri 19 Aug 13:32:58 2016)。 このマクロは常に定義されます。

  • _VC_NODEFAULTLIB/Zl (既定のライブラリ名の省略) コンパイラ オプションが設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _WCHAR_T_DEFINED 既定の /Zc:wchar_t コンパイラ オプションが設定されている場合、1 として定義されます。 _WCHAR_T_DEFINED マクロは定義されますが、 /Zc:wchar_t- コンパイラ オプションが設定されていて、 wchar_t がプロジェクトに含まれるシステム ヘッダー ファイルで定義されている場合は、値がありません。 それ以外の場合は、定義されません。

  • _WIN32 コンパイル ターゲットが 32 ビットの ARM、64 ビットの ARM、x86、または x64 の場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _WIN64 コンパイル ターゲットが 64 ビットの ARM または x64 の場合、1 として定義されます。 それ以外の場合は、定義されません。

  • _WINRT_DLL C++ としてコンパイルされ、/ZW (Windows ランタイム コンパイル) および /LD または /LDd コンパイラ オプションの両方が設定されている場合、1 として定義されます。 それ以外の場合は、定義されません。

ATL または MFC ライブラリのバージョンを識別するプリプロセッサ マクロは、コンパイラによって事前に定義されません。 ATL および MFC ライブラリ ヘッダーにより、これらのバージョン マクロは内部で定義されます。 必須のヘッダーが含まれる前に作成されたプリプロセッサ ディレクティブには定義されません。

  • _ATL_VER ATL バージョン番号をエンコードする整数リテラルとして、<atldef.h> で定義されます。

  • _MFC_VER MFC のバージョン番号をエンコードする整数リテラルとして、<afxver_.h> で定義されます。

関連項目

マクロ (C/C++)
プリプロセッサ演算子
プリプロセッサ ディレクティブ