Udostępnij za pośrednictwem


Wstępnie zdefiniowane makra

Kompilator Microsoft C/C++ (MSVC) wstępnie zdefiniowane niektóre makra preprocesora w zależności od języka (C lub C++), celu kompilacji i wybranych opcji kompilatora.

MSVC obsługuje wstępnie zdefiniowane makra preprocesora wymagane przez standardy ANSI/ISO C99, C11 i C17 oraz standardy ISO C++14, C++17 i C++20. Implementacja obsługuje również kilka makr preprocesora specyficznych dla firmy Microsoft.

Niektóre makra są definiowane tylko dla określonych środowisk kompilacji lub opcji kompilatora. Z wyjątkiem przypadków, w których zanotowano, makra są definiowane w całej jednostce tłumaczenia tak, jakby zostały określone jako /D argumenty opcji kompilatora. Po zdefiniowaniu preprocesor rozszerza makra określone wartości przed kompilacją. Wstępnie zdefiniowane makra nie przyjmują żadnych argumentów i nie można ich ponownie zdefiniować.

Identyfikator wstępnie zdefiniowany w warstwie Standardowa

Kompilator obsługuje ten wstępnie zdefiniowany identyfikator określony przez iso C99 i ISO C++11.

  • __func__Niekwalifikowana i niewielęgodna nazwa otaczającej funkcji jako statyczna tablica const funkcji lokalnej klasy char.

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

Standardowe wstępnie zdefiniowane makra

Kompilator obsługuje te wstępnie zdefiniowane makra określone przez standardy ISO C99, C11, C17 i ISO C++17.

  • __cplusplus Zdefiniowano jako wartość literału liczby całkowitej, gdy jednostka tłumaczenia jest kompilowana jako C++. W przeciwnym razie niezdefiniowane.

  • __DATE__ Data kompilacji bieżącego pliku źródłowego. Data to literał ciągu o stałej długości formularza Mmm dd rrrr. Nazwa miesiąca Mmm jest taka sama jak skrócona nazwa miesiąca wygenerowana przez funkcję asctime biblioteki środowiska uruchomieniowego języka C (CRT). Pierwszy znak daty dd to spacja, jeśli wartość jest mniejsza niż 10. To makro jest zawsze zdefiniowane.

  • __FILE__ Nazwa bieżącego pliku źródłowego. __FILE__ rozwija się do literału ciągu znaków. Aby upewnić się, że zostanie wyświetlona pełna ścieżka do pliku, użyj opcji /FC (Pełna ścieżka pliku kodu źródłowego w diagnostyce). To makro jest zawsze zdefiniowane.

  • __LINE__ Zdefiniowano jako numer wiersza liczby całkowitej w bieżącym pliku źródłowym. Wartość tego makra można zmienić przy użyciu #line dyrektywy . Całkowity typ wartości __LINE__ może się różnić w zależności od kontekstu. To makro jest zawsze zdefiniowane.

  • __STDC__ Zdefiniowano jako 1 podczas kompilowania jako C i jeśli określono opcję kompilatora /Za . Począwszy od programu Visual Studio 2022 w wersji 17.2, jest on zdefiniowany jako 1, gdy jest kompilowany jako C i czy /std:c11 określono opcję kompilatora lub /std:c17 . W przeciwnym razie niezdefiniowane.

  • __STDC_HOSTED__Zdefiniowana jako 1, jeśli implementacja jest implementacją hostowaną, która obsługuje całą wymaganą bibliotekę standardową. W przeciwnym razie zdefiniowano wartość 0.

  • __STDC_NO_ATOMICS__ Zdefiniowana jako 1, jeśli implementacja nie obsługuje opcjonalnych niepodzielnych standardowych elementów niepodzielnych. Implementacja MSVC definiuje ją jako 1 podczas kompilowania jako C i określono jedną z /std opcji C11 lub C17.

  • __STDC_NO_COMPLEX__ Zdefiniowana jako 1, jeśli implementacja nie obsługuje opcjonalnych standardowych liczb zespolonych. Implementacja MSVC definiuje ją jako 1 podczas kompilowania jako C i określono jedną z /std opcji C11 lub C17.

  • __STDC_NO_THREADS__ Zdefiniowana jako 1, jeśli implementacja nie obsługuje opcjonalnych standardowych wątków. Implementacja MSVC definiuje ją jako 1 podczas kompilowania jako C i określono jedną z /std opcji C11 lub C17.

  • __STDC_NO_VLA__ Zdefiniowana jako 1, jeśli implementacja nie obsługuje standardowych tablic o zmiennej długości. Implementacja MSVC definiuje ją jako 1 podczas kompilowania jako C i określono jedną z /std opcji C11 lub C17.

  • __STDC_VERSION__ Zdefiniowane podczas kompilowania jako C i jednej z /std opcji C11 lub C17 jest określony. Jest on rozszerzany do 201112L dla /std:c11, i 201710L dla /std:c17.

  • __STDCPP_DEFAULT_NEW_ALIGNMENT__ Gdy /std:c17 zostanie określone lub nowsze, to makro rozszerza się na size_t literał, który ma wartość wyrównania gwarantowane przez wywołanie do wyrównania nieświadome operator new. Większe wyrównania są przekazywane do przeciążenia obsługującego wyrównanie, takiego jak operator new(std::size_t, std::align_val_t). Aby uzyskać więcej informacji, zobacz /Zc:alignedNew (Alokacja wyrównana nadmiernie w języku C++17).

  • __STDCPP_THREADS__ Zdefiniowano jako 1, jeśli i tylko wtedy, gdy program może mieć więcej niż jeden wątek wykonywania i skompilowany jako C++. W przeciwnym razie niezdefiniowane.

  • __TIME__ Czas tłumaczenia wstępnie przetworzonej jednostki tłumaczenia. Czas to literał ciągu znaków formularza hh:mm:ss, taki sam jak czas zwracany przez funkcję asctime CRT. To makro jest zawsze zdefiniowane.

Wstępnie zdefiniowane makra specyficzne dla firmy Microsoft

Program MSVC obsługuje inne wstępnie zdefiniowane makra:

  • __ARM_ARCH Zdefiniowano jako literał liczb całkowitych reprezentujący wersję architektury usługi ARM. Wartość jest zdefiniowana jako 8 dla architektury Armv8-A. W przypadku wersji 8.1 i nowszych wartość jest skalowana dla wersji pomocniczych, takich jak X.Y, przy użyciu formuły X * 100 + Y zgodnie z definicją rozszerzenia języka ARM C. Na przykład w przypadku armv8.1 __ARM_ARCH wartość to 8 * 100 + 1 lub 801. Aby ustawić wersję architektury usługi ARM, zobacz /arch (ARM64). To makro zostało wprowadzone w programie Visual Studio 2022 w wersji 17.10.

  • __ATOM__ Zdefiniowana jako 1, gdy jest ustawiona /favor:ATOM opcja kompilatora, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.

  • __AVX__Zdefiniowane jako 1, gdy /arch:AVXsą ustawione opcje , /arch:AVX2/arch:AVX512 lub /arch:AVX10.1 kompilatora, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.

  • __AVX2__ Zdefiniowana jako 1, gdy jest ustawiona /arch:AVX2opcja , /arch:AVX512 lub /arch:AVX10.1 kompilatora, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.

  • __AVX512BW__ Zdefiniowano jako 1, gdy jest ustawiona /arch:AVX512 opcja kompilatora lub /arch:AVX10.1 , a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.

  • __AVX512CD__ Zdefiniowano jako 1, gdy jest ustawiona /arch:AVX512 opcja kompilatora lub /arch:AVX10.1 , a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.

  • __AVX512DQ__ Zdefiniowano jako 1, gdy jest ustawiona /arch:AVX512 opcja kompilatora lub /arch:AVX10.1 , a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.

  • __AVX512F__ Zdefiniowano jako 1, gdy jest ustawiona /arch:AVX512 opcja kompilatora lub /arch:AVX10.1 , a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.

  • __AVX512VL__ Zdefiniowano jako 1, gdy jest ustawiona /arch:AVX512 opcja kompilatora lub /arch:AVX10.1 , a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.

  • __AVX10_VER__ Zdefiniowano jako liczbę całkowitą reprezentującą wersję avX10, gdy /arch:AVX10.1 jest ustawiona opcja kompilatora, a element docelowy kompilatora to x86 lub x64. W przeciwnym razie niezdefiniowane.

  • _CHAR_UNSIGNED Zdefiniowano jako 1, jeśli typ domyślny char jest niepodpisany. Ta wartość jest definiowana, gdy jest ustawiona opcja kompilatora /J (domyślny typ znaku jest niepodpisany). W przeciwnym razie niezdefiniowane.

  • __CLR_VER Zdefiniowano jako literał całkowity reprezentujący wersję środowiska uruchomieniowego języka wspólnego (CLR) używanego do kompilowania aplikacji. Wartość jest kodowana w postaci Mmmbbbbb, gdzie M jest główną wersją środowiska uruchomieniowego, mm jest pomocniczą wersją środowiska uruchomieniowego i bbbbb jest numerem kompilacji. __CLR_VER jest definiowany, jeśli opcja kompilatora /clr jest ustawiona. W przeciwnym razie niezdefiniowane.

    // clr_ver.cpp
    // compile with: /clr
    using namespace System;
    int main() {
       Console::WriteLine(__CLR_VER);
    }
    
  • _CONTROL_FLOW_GUARDZdefiniowana jako 1, gdy jest ustawiona opcja kompilatora /guard:cf (Włącz funkcję Control Flow Guard). W przeciwnym razie niezdefiniowane.

  • __COUNTER__ Rozwija się do literału liczby całkowitej, który zaczyna się od 0. Wartość zwiększa się o 1 za każdym razem, gdy jest używana w pliku źródłowym lub w dołączonych nagłówkach pliku źródłowego. __COUNTER__ zapamiętuje jego stan podczas używania wstępnie skompilowanych nagłówków. To makro jest zawsze zdefiniowane.

    W tym przykładzie użyto __COUNTER__ metody przypisywania unikatowych identyfikatorów do trzech różnych obiektów tego samego typu. Konstruktor exampleClass przyjmuje liczbę całkowitą jako parametr. W mainsystemie aplikacja deklaruje trzy obiekty typu exampleClass, używając __COUNTER__ jako unikatowego parametru identyfikatora:

    // 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 Zdefiniowana jako wartość literału liczby całkowitej 200406 podczas kompilowania jako C++ i ustawiono opcję kompilatora /clr . W przeciwnym razie niezdefiniowane. Gdy jest zdefiniowana, __cplusplus_cli działa w całej jednostce tłumaczenia.

    // 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_winrtZdefiniowana jako wartość literału liczby całkowitej 201009 po skompilowaniu jako C++ i /ZW ustawiono opcję kompilatora (kompilacja środowisko wykonawcze systemu Windows). W przeciwnym razie niezdefiniowane.

  • _CPPRTTIZdefiniowano jako 1, jeśli jest ustawiona /GR opcja kompilatora (Włącz informacje o typie czasu wykonywania). W przeciwnym razie niezdefiniowane.

  • _CPPUNWINDZdefiniowano jako 1, jeśli ustawiono co najmniej jedną /GX z opcji kompilatora (Włącz obsługę wyjątków),/clr (kompilacja środowiska uruchomieniowego języka wspólnego) lub /EH (model obsługi wyjątków). W przeciwnym razie niezdefiniowane.

  • _DEBUG Zdefiniowano jako 1, gdy jest ustawiona /LDdopcja , /MDdlub /MTd kompilatora. W przeciwnym razie niezdefiniowane.

  • _DLL Zdefiniowane jako 1, gdy jest ustawiona opcja kompilatora /MD lub /MDd (wielowątkowa biblioteka DLL). W przeciwnym razie niezdefiniowane.

  • __FUNCDNAME__ Zdefiniowano jako literał ciągu, który zawiera ozdobioną nazwę otaczającej funkcji. Makro jest definiowane tylko w ramach funkcji. Makro __FUNCDNAME__ nie jest rozwinięte, jeśli używasz /EP opcji lub /P kompilatora.

    W tym przykładzie użyto __FUNCDNAME__makr , __FUNCSIG__i __FUNCTION__ do wyświetlania informacji o funkcji.

    // 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__ Zdefiniowano jako literał ciągu, który zawiera podpis otaczającej funkcji. Makro jest definiowane tylko w ramach funkcji. Makro __FUNCSIG__ nie jest rozwinięte, jeśli używasz /EP opcji lub /P kompilatora. Podczas kompilowania dla obiektu docelowego 64-bitowego konwencja wywoływania jest __cdecl domyślnie. Przykład użycia można znaleźć w makrze __FUNCDNAME__ .

  • __FUNCTION__ Zdefiniowano jako literał ciągu, który zawiera nieukodowaną nazwę otaczającej funkcji. Makro jest definiowane tylko w ramach funkcji. Makro __FUNCTION__ nie jest rozwinięte, jeśli używasz /EP opcji lub /P kompilatora. Przykład użycia można znaleźć w makrze __FUNCDNAME__ .

  • _INTEGRAL_MAX_BITS Zdefiniowano jako wartość literału liczby całkowitej 64, maksymalny rozmiar (w bitach) dla typu całkowitego niewektorowego. To makro jest zawsze zdefiniowane.

    // integral_max_bits.cpp
    #include <stdio.h>
    int main() {
        printf("%d\n", _INTEGRAL_MAX_BITS);
    }
    
  • __INTELLISENSE__ Zdefiniowano jako 1 podczas przekazywania kompilatora intelliSense w środowisku IDE programu Visual Studio. W przeciwnym razie niezdefiniowane. Tego makra można użyć do ochrony kodu, którego kompilator IntelliSense nie rozumie, lub użyć go do przełączania się między kompilatorem i kompilatorem funkcji IntelliSense. Aby uzyskać więcej informacji, zobacz Porady dotyczące rozwiązywania problemów z powolnym działaniem funkcji IntelliSense.

  • _ISO_VOLATILE Zdefiniowano jako 1, jeśli jest ustawiona opcja kompilatora /volatile:iso . W przeciwnym razie niezdefiniowane.

  • _KERNEL_MODEZdefiniowane jako 1, jeśli /kernel jest ustawiona opcja kompilatora (Utwórz plik binarny trybu jądra). W przeciwnym razie niezdefiniowane.

  • _M_AMD64 Zdefiniowano jako wartość literału liczby całkowitej 100 dla kompilacji przeznaczonych dla procesorów x64 lub ARM64EC. W przeciwnym razie niezdefiniowane.

  • _M_ARM Zdefiniowano jako wartość literału liczby całkowitej 7 dla kompilacji przeznaczonych dla procesorów ARM. Niezdefiniowane dla arm64, ARM64EC i innych obiektów docelowych.

  • _M_ARM_ARMV7VE Zdefiniowana jako 1, gdy opcja kompilatora /arch:ARMv7VE jest ustawiona dla kompilacji przeznaczonych dla procesorów ARM. W przeciwnym razie niezdefiniowane.

  • _M_ARM_FP Zdefiniowano jako wartość literału liczby całkowitej, która wskazuje, która /arch opcja kompilatora została ustawiona dla celów procesora ARM. W przeciwnym razie niezdefiniowane.

    • Wartość w zakresie od 30 do 39, jeśli nie /arch określono opcji ARM, wskazująca domyślną architekturę dla usługi ARM została ustawiona (VFPv3).

    • Wartość w zakresie 40–49, jeśli /arch:VFPv4 została ustawiona.

    • Aby uzyskać więcej informacji, zobacz /arch (ARM).

  • _M_ARM64 Zdefiniowano jako 1 dla kompilacji przeznaczonych dla usługi ARM64. W przeciwnym razie niezdefiniowane.

  • _M_ARM64EC Zdefiniowano jako 1 dla kompilacji docelowych ARM64EC. W przeciwnym razie niezdefiniowane.

  • _M_CEEZdefiniowana jako 001, jeśli jest ustawiona jakakolwiek /clr opcja kompilatora (kompilacja środowiska uruchomieniowego języka wspólnego). W przeciwnym razie niezdefiniowane.

  • _M_CEE_PURE Przestarzałe począwszy od programu Visual Studio 2015. Zdefiniowana jako 001, jeśli jest ustawiona opcja kompilatora /clr:pure . W przeciwnym razie niezdefiniowane.

  • _M_CEE_SAFE Przestarzałe począwszy od programu Visual Studio 2015. Zdefiniowana jako 001, jeśli jest ustawiona opcja kompilatora /clr:safe . W przeciwnym razie niezdefiniowane.

  • _M_FP_CONTRACT Dostępne począwszy od programu Visual Studio 2022. Zdefiniowano jako 1, jeśli /fp:contract ustawiono opcję kompilatora lub /fp:fast . W przeciwnym razie niezdefiniowane.

  • _M_FP_EXCEPT Zdefiniowano jako 1, jeśli /fp:except ustawiono opcję kompilatora lub /fp:strict . W przeciwnym razie niezdefiniowane.

  • _M_FP_FAST Zdefiniowano jako 1, jeśli jest ustawiona opcja kompilatora /fp:fast . W przeciwnym razie niezdefiniowane.

  • _M_FP_PRECISE Zdefiniowano jako 1, jeśli jest ustawiona opcja kompilatora /fp:precise . W przeciwnym razie niezdefiniowane.

  • _M_FP_STRICT Zdefiniowano jako 1, jeśli jest ustawiona opcja kompilatora /fp:strict . W przeciwnym razie niezdefiniowane.

  • _M_IX86 Zdefiniowano jako wartość literału liczby całkowitej 600 dla kompilacji przeznaczonych dla procesorów x86. To makro nie jest zdefiniowane dla elementów docelowych kompilacji x64 ani ARM.

  • _M_IX86_FP Zdefiniowano jako wartość literału liczby całkowitej, która wskazuje /arch opcję kompilatora, która została ustawiona lub wartość domyślna. To makro jest zawsze definiowane, gdy element docelowy kompilacji jest procesorem x86. W przeciwnym razie niezdefiniowane. Po zdefiniowaniu wartość to:

    • 0, jeśli została ustawiona opcja kompilatora /arch:IA32 .

    • 1, jeśli została ustawiona opcja kompilatora /arch:SSE .

    • 2, jeśli /arch:SSE2ustawiono opcję , /arch:AVX, /arch:AVX2/arch:AVX512 lub /arch:AVX10.1 kompilatora. Ta wartość jest wartością domyślną, jeśli /arch nie określono opcji kompilatora. Po /arch:AVX określeniu makra __AVX__ jest również definiowane. Gdy /arch:AVX2 jest określony, zarówno, jak __AVX__ i __AVX2__ są również zdefiniowane. Gdy /arch:AVX512 parametr jest określony, , __AVX512BW____AVX512CD____AVX2____AVX512DQ____AVX____AVX512F__i __AVX512VL__ są również zdefiniowane. Gdy /arch:AVX10.1 parametr jest określony, , __AVX512BW____AVX512DQ____AVX____AVX512CD____AVX512F____AVX2____AVX512VL__ i __AVX10_VER__ są również zdefiniowane.

    • Aby uzyskać więcej informacji, zobacz /arch (x86).

  • _M_X64 Zdefiniowano jako wartość literału liczby całkowitej 100 dla kompilacji przeznaczonych dla procesorów x64 lub ARM64EC. W przeciwnym razie niezdefiniowane.

  • _MANAGED Zdefiniowano jako 1, gdy jest ustawiona opcja kompilatora /clr . W przeciwnym razie niezdefiniowane.

  • _MSC_BUILD Zdefiniowano jako literał liczb całkowitych, który zawiera element numeru poprawki numeru wersji kompilatora. Numer poprawki to ostatni element rozdzielanego okresem numeru wersji. Jeśli na przykład numer wersji kompilatora Microsoft C/C++ to 15.00.20706.01, _MSC_BUILD makro to 1. To makro jest zawsze zdefiniowane.

  • _MSC_EXTENSIONSZdefiniowane jako 1, jeśli jest ustawiona opcja kompilatora on-by-default /Ze (Włącz rozszerzenia języka). W przeciwnym razie niezdefiniowane.

  • _MSC_FULL_VER Zdefiniowane jako literał liczb całkowitych, który koduje główne, pomocnicze i numer kompilacji elementów numeru wersji kompilatora. Numer główny jest pierwszym elementem rozdzielanego kropkami numeru wersji, numer pomocniczy jest drugim elementem, a numer kompilacji jest trzecim elementem.

    Jeśli na przykład kompilator Microsoft C/C++ ma wersję 19.39.33519, _MSC_FULL_VER jest 193933519. Wprowadź cl /? w wierszu polecenia, aby wyświetlić numer wersji kompilatora. To makro jest zawsze zdefiniowane. Aby uzyskać więcej informacji na temat przechowywania wersji kompilatora, zobacz Wersje kompilatora języka C++ i wersje usługi począwszy od programu Visual Studio 2017, aby uzyskać więcej informacji na temat programu Visual Studio 2019 16.8, 16.9, 16.10 i 16.11, które wymagają _MSC_FULL_VER od nich odróżnić.

  • _MSC_VER Zdefiniowano jako literał liczb całkowitych, który koduje główne i pomocnicze elementy numeru wersji kompilatora. Numer główny jest pierwszym elementem rozdzielanego kropkami numeru wersji, a numer pomocniczy jest drugim elementem. Jeśli na przykład numer wersji kompilatora Microsoft C/C++ to 17.00.51106.1, wartość to _MSC_VER 1700. Wprowadź cl /? w wierszu polecenia, aby wyświetlić numer wersji kompilatora. To makro jest zawsze zdefiniowane.

    Aby przetestować wersje kompilatora lub aktualizacje w danej wersji programu Visual Studio lub nowszej, użyj >= operatora . Można go użyć w dyrektywie warunkowej, aby porównać _MSC_VER ją ze znaną wersją. Jeśli masz kilka wzajemnie wykluczających się wersji do porównania, porządkuj porównania w kolejności malejącej numeru wersji. Na przykład ten kod sprawdza kompilatory wydane w programie Visual Studio 2017 lub nowszym. Następnie sprawdza, czy kompilatory zostały wydane w programie Visual Studio 2015 lub nowszym. Następnie sprawdza wszystkie kompilatory wydane przed programem Visual Studio 2015:

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

    Aby uzyskać więcej informacji o programach Visual Studio 2019 16.8 i 16.9 oraz 16.10 i 16.11, które współużytkowały te same wersje główne i pomocnicze (i mają taką samą wartość dla _MSC_VERprogramu ), zobacz Wersje usługi, począwszy od programu Visual Studio 2017.

    Aby uzyskać więcej informacji na temat historii przechowywania wersji kompilatora i numerów wersji kompilatora oraz odpowiadających im wersji programu Visual Studio, zobacz Wersje kompilatora języka C++. Ponadto wersja kompilatora Visual C++ na blogu zespołu microsoft C++.

  • _MSVC_LANG Zdefiniowano jako literał całkowity, który określa standard języka C++ przeznaczony dla kompilatora. Ustawiany jest tylko kod skompilowany w języku C++. Makro jest domyślnie wartością 201402L literału liczby całkowitej lub po określeniu opcji kompilatora /std:c++14 . Makro jest ustawione na 201703L wartość , jeśli określono opcję kompilatora /std:c++17 . Makro jest ustawione na 202002L wartość , jeśli określono opcję kompilatora /std:c++20 . Jest ona ustawiona na wyższą, nieokreśloną wartość po określeniu /std:c++latest opcji. W przeciwnym razie makro jest niezdefiniowane. Opcje kompilatora _MSVC_LANG makr i /std (Określ wersję standardową języka) są dostępne począwszy od programu Visual Studio 2015 Update 3.

  • __MSVC_RUNTIME_CHECKS Zdefiniowano jako 1, gdy ustawiono jedną z opcji kompilatora /RTC . W przeciwnym razie niezdefiniowane.

  • _MSVC_TRADITIONAL:

    • Dostępne począwszy od programu Visual Studio 2017 w wersji 15.8: zdefiniowane jako 0 po ustawieniu opcji kompilatora trybu /experimental:preprocessor zgodności preprocesora. Zdefiniowana jako 1 domyślnie lub gdy /experimental:preprocessor- jest ustawiona opcja kompilatora, aby wskazać, że jest używany tradycyjny preprocesor.
    • Dostępne począwszy od programu Visual Studio 2019 w wersji 16.5: zdefiniowane jako 0 po ustawieniu opcji kompilatora trybu /Zc:preprocessor zgodności preprocesora. Zdefiniowane jako 1 domyślnie lub gdy /Zc:preprocessor- jest ustawiona opcja kompilatora, aby wskazać, że tradycyjny preprocesor jest używany (zasadniczo /Zc:preprocessor zastępuje przestarzałe /experimental:preprocessor).
    #if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL
    // Logic using the traditional preprocessor
    #else
    // Logic using cross-platform compatible preprocessor
    #endif
    
  • _MTZdefiniowano jako 1, gdy /MD określono lub /MDd (wielowątkową bibliotekę DLL) lub/MT /MTd (wielowątkową). W przeciwnym razie niezdefiniowane.

  • _NATIVE_WCHAR_T_DEFINED Zdefiniowano jako 1, gdy jest ustawiona opcja kompilatora /Zc:wchar_t . W przeciwnym razie niezdefiniowane.

  • _OPENMP Zdefiniowana jako literał liczby całkowitej 200203, jeśli /openmp ustawiono opcję kompilatora (Włącz obsługę protokołu OpenMP 2.0). Ta wartość reprezentuje datę specyfikacji OpenMP zaimplementowanej przez MSVC. W przeciwnym razie niezdefiniowane.

    // _OPENMP_dir.cpp
    // compile with: /openmp
    #include <stdio.h>
    int main() {
        printf("%d\n", _OPENMP);
    }
    
  • _PREFAST_ Zdefiniowano jako 1, gdy jest ustawiona opcja kompilatora /analyze . W przeciwnym razie niezdefiniowane.

  • __SANITIZE_ADDRESS__ Dostępne począwszy od programu Visual Studio 2019 w wersji 16.9. Zdefiniowano jako 1, gdy jest ustawiona opcja kompilatora /fsanitize=address . W przeciwnym razie niezdefiniowane.

  • __TIMESTAMP__ Zdefiniowane jako literał ciągu, który zawiera datę i godzinę ostatniej modyfikacji bieżącego pliku źródłowego, w skróconej postaci stałej długości zwracanej przez funkcję CRT asctime , na przykład Fri 19 Aug 13:32:58 2016. To makro jest zawsze zdefiniowane.

  • _VC_NODEFAULTLIBZdefiniowana jako 1, gdy jest ustawiona opcja kompilatora /Zl (Pomiń domyślną nazwę biblioteki). W przeciwnym razie niezdefiniowane.

  • _WCHAR_T_DEFINED Zdefiniowana jako 1, gdy jest ustawiona domyślna /Zc:wchar_t opcja kompilatora. Makro _WCHAR_T_DEFINED jest zdefiniowane, ale nie ma wartości, jeśli /Zc:wchar_t- jest ustawiona opcja kompilatora i wchar_t jest definiowana w pliku nagłówka systemu zawartego w projekcie. W przeciwnym razie niezdefiniowane.

  • _WIN32 Zdefiniowano jako 1, gdy element docelowy kompilacji to 32-bitowa usługa ARM, 64-bitowa usługa ARM, x86 lub x64. W przeciwnym razie niezdefiniowane.

  • _WIN64 Zdefiniowany jako 1, gdy element docelowy kompilacji to 64-bitowa usługa ARM lub x64. W przeciwnym razie niezdefiniowane.

  • _WINRT_DLLZdefiniowano jako 1 podczas kompilowania jako C++ oraz opcji (kompilacja środowisko wykonawcze systemu Windows) i /LDd/LD kompilatora./ZW W przeciwnym razie niezdefiniowane.

Żadne makra preprocesora identyfikujące wersję biblioteki ATL lub MFC nie są wstępnie zdefiniowane przez kompilator. Nagłówki bibliotek ATL i MFC definiują te makra wersji wewnętrznie. Nie są one zdefiniowane w dyrektywach preprocesora wykonanych przed dołączeniu wymaganego nagłówka.

  • _ATL_VER Zdefiniowane jako <atldef.h> literał liczb całkowitych, który koduje numer wersji ATL.

  • _MFC_VER Zdefiniowane jako <afxver_.h> literał liczb całkowitych, który koduje numer wersji MFC.

Zobacz też

Makra (C/C++)
Operatory preprocesora
Dyrektywy preprocesora